SharedObject使用:在FluorineFx.net与Flex中使用共享对象维护在线用户列表实例【转】
一、添加一个新的FluorineFx的服务类项目OnLineService,删除原有的Sample.cs,并添加一个用户类定义与一个ApplicationAdpater类:如下:
/*-- User.cs --*/
namespace OnLineService
{
public class User
{
public string UserName { get; set; }
public string UserPsw { get; set; }
}
}
/* -- ApplicationAdapter类:DemoApp.cs --*/
using FluorineFx;
using FluorineFx.Messaging.Adapter;
using FluorineFx.Messaging.Api;
using FluorineFx.Messaging.Api.SO;
namespace OnLineService
{
/// <summary>
/// Fluorine sample service.
/// </summary>
[RemotingService("用户登录状态测试程序")]
public class DemoApp:ApplicationAdapter
{
public override bool AppConnect(IConnection connection, object[] parameters)
{
string userName = parameters[0] as string;
string password = parameters[1] as string;
// 这里可以自定义登录判断验证逻辑,此处只要密码为000即可进入
if (password != "000")
return false;
// 将当前连接添加一个userName属性与当前登录用户关联起来
// 以便此连接掉线时,可以准确定位到其相关用户
connection.Client.SetAttribute("userName", userName);
//获取共享对象(OnLineUsers)
ISharedObject users_so = GetSharedObject(connection.Scope, "OnLineUsers");
if (users_so == null)
{
//第一个用户时共享对象不存在,需创建
CreateSharedObject(connection.Scope, "OnLineUsers", false);
users_so = GetSharedObject(connection.Scope, "OnLineUsers");
}
//更新共享对象key为用户名,value为用户对象
//value可以为更复杂的对象,但尽量不要打包List或array,因为Flex端解包不易
users_so.SetAttribute(userName, new User() { UserName = userName, UserPsw = password });
return true;
}
public override void AppDisconnect(IConnection connection)
{
string userName = connection.Client.GetAttribute("userName") as string;
ISharedObject users_so = GetSharedObject(connection.Scope, "OnLineUsers");
if (users_so != null)
{
//从共享对象中移除当前退出系统用户
users_so.RemoveAttribute(userName);
}
base.AppDisconnect(connection);
}
}
}
二、在解决方案中添加一个Fluorine.net Web项目
2.1 在Web根目录下添加apps文件夹,apps下添加OnLineUser文件夹,OnLineUser文件夹下添加app.config配置文件,其下配置应用程序处理为上面定义的DemoApp,如下:

2.2 修改WEB-INF下的service-config.xml,打开其my-rtmp信道配置节(fluorineFx添加的web项目时,默认会将此节注释掉,打开即可)

2.3 在根目录下添加Flex文件下,其下加入libs、src、swf三个子文件夹,将fds.swc拷入libs文件夹,其它两个文件夹在后面的步骤中分别用作 Flex项目的源文件与输出文件目录。
项目的文件组织如下:

三、在Flex Builder3中新建项目OnLineUserDemo,项目路径为2.3中的Flex文件夹,配置测试服务器为asp.net,WebRootUrl路径为vs运行网站时的路径,如下图中的兰色部分:

3.1 右击flex项目的属性(Properties),
配置FlexBuilderPath如下:

配置FlexCompier的参数如下:

注:上面的“E:..”请换成你本地项目中services-config.xml对应的路径(包括下面的Server配置)
配置FlexServce的参数如下:

3.2 以下为OnLineUserDemo.mxml源代码:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
width="600" height="382" backgroundGradientAlphas="[1.0, 1.0]"
backgroundGradientColors="[#000000, #049FF1]" fontSize="12">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.messaging.config.ServerConfig;
private var nc:NetConnection;
private var so:SharedObject;
private function connectionServer(event:MouseEvent):void
{
var endpoint:String=ServerConfig.getChannel("my-rtmp").endpoint;
nc = new NetConnection();
nc.connect(endpoint+"/OnLineUser",this.txtUserName.text,this.txtPassword.text);
nc.addEventListener(NetStatusEvent.NET_STATUS,onStatusHandler);
nc.client = this;
}
private function onStatusHandler(event:NetStatusEvent):void
{
this.connStatus.text = "连接状态:" + event.info.code;
if(event.info.code == "NetConnection.Connect.Success")
{
//连接远程共享对象
so = SharedObject.getRemote("OnLineUsers",nc.uri,false);
if(so)
{
so.addEventListener(SyncEvent.SYNC,onSyncHandler);
so.connect(nc);
so.client = this;
}
onCallClient("用户【 <font color=\"#FF0000\">"+this.txtUserName.text+"</font>】登陆了系统!");
}
}
private function onSyncHandler(event:SyncEvent):void
{
var temp:Array = new Array();
//so.data中每一个元素即服务器端维护的每一个attribute
for(var u:Object in so.data)
{
temp.push(so.data[u]);
}
this.dgUserList.dataProvider = temp;
}
private function onCallClient(message:String):void
{
so.send("writeMsg",message);
//所以通过so的send方法,可以同时调用每个客户端的writeMsg程序,类似发送广播
}
//writeMsg一定要为public,否则so调用不到
public function writeMsg(message:Object):void
{
var param:String=message.toString();
txtTraceArea.htmlText += param + "\n";
txtTraceArea.validateNow();
txtTraceArea.verticalScrollPosition = txtTraceArea.maxVerticalScrollPosition;
}
]]>
</mx:Script>
<mx:Label x="302" y="153" id="connStatus" width="288" color="#FFFFFF"/>
<mx:Label x="302" y="181" id="nowRoom" width="288" color="#FFFFFF" />
<mx:DataGrid x="24" y="30" height="332" width="248" id="dgUserList">
<mx:columns>
<mx:DataGridColumn dataField="UserName" headerText="姓名"/>
<mx:DataGridColumn dataField="UserPsw" headerText="蜜码"/>
</mx:columns>
</mx:DataGrid>
<mx:Form x="302" y="30" width="236">
<mx:FormItem label="用户名:" color="#FFFFFF">
<mx:TextInput id="txtUserName" width="130" color="#000000"/>
</mx:FormItem>
<mx:FormItem label="密 码:" color="#FFFFFF">
<mx:TextInput id="txtPassword" width="130"
color="#000000" displayAsPassword="true"/>
</mx:FormItem>
<mx:FormItem label="">
<mx:Button label="登陆服务器" click="connectionServer(event)"
enabled="{this.txtUserName.text.length>0?true:false}" color="#FFFFFF"/>
</mx:FormItem>
</mx:Form>
<mx:TextArea x="302" y="209" width="288" height="153" alpha="1.0"
backgroundColor="#F2D2D2" backgroundAlpha="0.26" color="#FFFFFF"
id="txtTraceArea" borderColor="#FFFFFF"/>
</mx:Application>
效果图:

SharedObject使用:在FluorineFx.net与Flex中使用共享对象维护在线用户列表实例【转】的更多相关文章
- AutoCAD.NET中添加图形对象的基本步骤与实例演示
https://blog.csdn.net/u011170962/article/details/37755201 要创建一个图形对象,需要遵循下面的步骤:1.得到创建对象的图形数据库:2.在内存中创 ...
- 《python源代码剖析》笔记 python中的List对象
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.PyListObject对象 --> 变长可变对象,可看作vector<Py ...
- java中的string对象深入了解
这里来对Java中的String对象做一个稍微深入的了解. Java对象实现的演进 String对象是Java中使用最频繁的对象之一,所以Java开发者们也在不断地对String对象的实现进行优化,以 ...
- 《python解释器源码剖析》第4章--python中的list对象
4.0 序 python中的list对象,底层对应的则是PyListObject.如果你熟悉C++,那么会很容易和C++中的list联系起来.但实际上,这个C++中的list大相径庭,反而和STL中的 ...
- springIoc中的单列对象的分析
最近有个同事去面试,其中有一个问题是关于spring单例的.本篇博文就发表一下小编我自己的理解~~. 使用过spring的程序猿应该都知道,我们的bean(controller.service和Dao ...
- 【转】FLEX中SharedObject介绍及应用
ShareObject介绍: 1 ShareObject,顾名思义共享对象,而通常意义上的共享,从B/S结构上来讲,无非是客户端(浏览器端)的共享和服务器端的共享了,不错,ShareObject刚好份 ...
- Flex中NetConnection与NetStream的关系、及浏览器并发连接数测试[转]
最近在做一个基于BS结构的视频会议系统,决定采用开源的FluorineFx.net与Flex结合的方法进行开发,前期开发都非常顺利,包括同步白板等.但到了实时视频传输的时候,原本设计是每个客户端可以显 ...
- Flex中设置Camera的视频清晰质量的最佳配合
今天需要设置Flex中的Camera组件的一些属性,后来发现清晰度不是很高,于是捣鼓了上午半天,设置了很多的参数,竟然发现手册上就是有现成的一些设置方法,郁闷!不过我还是专门设置了几个有用和必要的属性 ...
- ArcGIS for Flex中引入google map作底图
上篇文章到在ArcGIS View中引入google map,这里讲ArcGIS for Flex中引入google map作底图. 同样道理,以google map作底图,需要编写继承自TiledM ...
随机推荐
- 对人脑处理视觉的描述(摘《学习OpenCV(中文版)》)
人脑将视觉信号划分入很多个通道,将各种不同的信息输入你的大脑.你的大脑有一个关注系统,会根据任务识别出图像的重要部分,并做重点分析,而其他部分则分析得较少 .在人类视觉流中存在大量的反馈,但是目前我们 ...
- python install 2.7.10
CentOS 6.5升级Python和安装IPython 后来换成了CentOS 6.5,系统自带的Python版本是2.6.6. 图一:安装IPython需求 已经安装好gcc等编译工具.系统自带P ...
- ASP.NET MVC3 系列教程 - 部署你的WEB应用到IIS 6.0
I:ASP.NET MVC3 部署的前期工作 1.确认部署的服务器操作系统环境 首先我们确认服务器的操作系统版本 可以从系统命令行工具里输入: systeminfo 获取相关操作系统信息例如 然后再确 ...
- extjs 学习笔记(二)
EXTJS实用开发指南 1. 要使用ExtJS 框架的页面中一般包括下面几句: <link rel="stylesheet" type="text/css" ...
- 第三百四十三天 how can I 坚持
今天又莫名其妙的烦起来了,好没劲. 现在还在看电视机<太阳的后裔>,晚上也没怎么吃饭,干吃了两个馒头,老干妈+生洋葱,好凄惨. 上班看了好长时间会,乱七八糟的. 坚决不跳槽,但得坚持自己的 ...
- poj 1719 Shooting Contest
http://poj.org/problem?id=1719 Shooting Contest Time Limit: 1000MS Memory Limit: 10000K Total Subm ...
- UI:转自互联网资料
1.UIWindow和UIView和 CALayer 的联系和区别? 答:UIView是视图的基类,UIViewController是视图控制器的基类,UIResponder是表示一个可以在屏幕上 ...
- CentOS 使用yum命令安装出现错误提示”could not retrieve mirrorlist http://mirrorlist.centos.org ***”
刚安装完CentOS,使用yum命令安装一些常用的软件,使用如下命令:yum –y install gcc. 提示如下错误信息: Loaded plugins: fastestmirror, refr ...
- Visual Studio无法添加断点
今天在写代码的时候突然发现无法添加断点,更加详细的场景是“按F9可以添加调试行,但是断点不显示,且显示代码行数左边的灰色区域不见了”找了各种方法也没有解决,然后重启.修复甚至重装都不行,最后在万千网页 ...
- as [Frame]元标签
[Frame(factoryClass="XXX_Class")] 利用Frame元标签.在主SWF类名上面添加 [Frame(factoryClass="加载类类名&q ...