一、添加一个新的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&gt;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>

效果图:

 
posted @ 2012-02-08 13:45 羊圈里最帅的羊 阅读(194) 评论(1) 编辑 收藏
 
发表评论
 

#1楼[楼主] 2012-02-08 13:46 | 羊圈里最帅的羊 

本实例源代码下载:
点击下载

SharedObject使用:在FluorineFx.net与Flex中使用共享对象维护在线用户列表实例【转】的更多相关文章

  1. AutoCAD.NET中添加图形对象的基本步骤与实例演示

    https://blog.csdn.net/u011170962/article/details/37755201 要创建一个图形对象,需要遵循下面的步骤:1.得到创建对象的图形数据库:2.在内存中创 ...

  2. 《python源代码剖析》笔记 python中的List对象

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.PyListObject对象 --> 变长可变对象,可看作vector<Py ...

  3. java中的string对象深入了解

    这里来对Java中的String对象做一个稍微深入的了解. Java对象实现的演进 String对象是Java中使用最频繁的对象之一,所以Java开发者们也在不断地对String对象的实现进行优化,以 ...

  4. 《python解释器源码剖析》第4章--python中的list对象

    4.0 序 python中的list对象,底层对应的则是PyListObject.如果你熟悉C++,那么会很容易和C++中的list联系起来.但实际上,这个C++中的list大相径庭,反而和STL中的 ...

  5. springIoc中的单列对象的分析

    最近有个同事去面试,其中有一个问题是关于spring单例的.本篇博文就发表一下小编我自己的理解~~. 使用过spring的程序猿应该都知道,我们的bean(controller.service和Dao ...

  6. 【转】FLEX中SharedObject介绍及应用

    ShareObject介绍: 1 ShareObject,顾名思义共享对象,而通常意义上的共享,从B/S结构上来讲,无非是客户端(浏览器端)的共享和服务器端的共享了,不错,ShareObject刚好份 ...

  7. Flex中NetConnection与NetStream的关系、及浏览器并发连接数测试[转]

    最近在做一个基于BS结构的视频会议系统,决定采用开源的FluorineFx.net与Flex结合的方法进行开发,前期开发都非常顺利,包括同步白板等.但到了实时视频传输的时候,原本设计是每个客户端可以显 ...

  8. Flex中设置Camera的视频清晰质量的最佳配合

    今天需要设置Flex中的Camera组件的一些属性,后来发现清晰度不是很高,于是捣鼓了上午半天,设置了很多的参数,竟然发现手册上就是有现成的一些设置方法,郁闷!不过我还是专门设置了几个有用和必要的属性 ...

  9. ArcGIS for Flex中引入google map作底图

    上篇文章到在ArcGIS View中引入google map,这里讲ArcGIS for Flex中引入google map作底图. 同样道理,以google map作底图,需要编写继承自TiledM ...

随机推荐

  1. JAVA & Android 系统环境变量配置

    Java JAVA_HOME:C:\Program Files\Java\jdk1.7.0_40 CLASSPATH:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\ ...

  2. java 创建线程

    一.继承Thread类 为创建一个线程,最简单的方法就是从Thread类继承.这个类包含了创建和运行线程所需的一切东西.Thread类最重要的方法是run(),但为了使用run(),必须对其进行重写. ...

  3. ANSI

    为了扩充ASCII编码,以用于显示本国的语言,不同的国家和地区制定了不同的编码标准,由此产生了GB2312.BIG5.JIS等各自的编码标准.这些使用两个字节来代表一个字符的各种汉字延伸编码方式被称为 ...

  4. cocos2d-x CCEditBox 字符不能显示完全的bug

    cocos2d-x CCEditBox 字符不能显示完全的bug (cocos2dx版本 2.2.0)用CCEditBox制作帐号输入框,当输入的内容超过框的宽度时,框里面不会显示当前输入的字符,显示 ...

  5. php获取上传多个文件缺失

    我们的一个页面编辑发布后台出现了图片无法上传保存的情况,经过调试对比发现,原来是file表单数量过多导致,减少file表单的数量即可上传成功.为了满足需求不减少file表单数并保证上传成功,于是更改了 ...

  6. 求职基础复习之冒泡排序c++版

    代码中在第一层循环中增加一个bool值,是为了防止在排序完成后还继续无谓的比较,最多会有(n-1)*(n-2)/2次循环. #include<iostream> using namespa ...

  7. [转]eoe社区cocos2d-x游戏引擎知识大汇总

    [eoeAndroid 社区]特意为大家汇总了cocos2d-x知识贴,分量十足,纯正干或.从基础教程到游戏应用的开发,我们不让知识流失,我们要做知识的搬运工还有加工 师.希望大家能够一起的学习,和大 ...

  8. 组建你自己的Theme,组件你的Style

    Andorid-Style,组建你自己的Theme,组件你的Style 前言: 今天,尝试了一个新的Demo,也尝试深入学习,话不多说,看一下,这个Demo如何实现的自定义主题与组件Style是如何绑 ...

  9. 各种边框样式。。本以为border不是这么用的。

    关于文本框样式□ 文本框样式 □ 显示虚线边框的文本框(IE5.5才可看到效果)  <INPUT style="border-width: 1px,1px,1px,1px;border ...

  10. SQL Server文本和图像函数

    文本和图像函数 1.查找特定字符串PATINDEX 语法与字符串的patindex一样. 2.获取文本指针TEXTPTR SQLServer在存储文本类型(ntext.text)和图像数据类型(ima ...