单纯从客户端上来看,FluorineFx的RSO跟FMS中的RSO几乎没什么不同(参见Flash/Flex学习笔记(15):FMS 3.5之远程共享对象(Remote Shared Object) ),只不过FMS是Adobe的收费产品,FluorineFx是用于.Net平台的开源免费产品

.

服务端代码:

1、为了防止客户端随意连接或创建任何属性的RSO,服务端可以定义一个用于安全处理的cs文件

using System.Collections;
using FluorineFx.Messaging.Api;
using FluorineFx.Messaging.Api.SO;namespace _02_SharedObject
{public class SampleSOSecurityHandler : ISharedObjectSecurity {#region ISharedObjectSecurity Members//是否允许连接public bool IsConnectionAllowed(ISharedObject so){            return true;}//是否允许创建rso对象(下面的代码仅允许创建名为position的rso对象)public bool IsCreationAllowed(IScope scope, string name, bool persistent){if (!"position".Equals(name) || !persistent)return false;elsereturn true;}//是否允许删除public bool IsDeleteAllowed(ISharedObject so, string key){return false;}//是否允许rso对象向服务端send指定回调方法(下面的代码仅允许发送名为drop的回调方法)public bool IsSendAllowed(ISharedObject so, string message, IList arguments){if (!"drop".Equals(message)){return false;}else{//这里把第一个参数处理一下,客户端可以在drop()方法中访问到处理后的参数if (arguments.Count > 0) {arguments[0] = "from server :" + arguments[0];}return true;}}//rso对象的属性是否可写public bool IsWriteAllowed(ISharedObject so, string key, object value){return true;}#endregion}
}

2、创建一个ApplicationAdapter(应用适配器)

using FluorineFx.Messaging.Adapter;
using FluorineFx.Messaging.Api;
using FluorineFx.Messaging.Api.SO;namespace _02_SharedObject
{/// <summary>/// Summary description for AppHandler./// </summary>public class SharedBallApplication : ApplicationAdapter{public SharedBallApplication(){}public override bool AppStart(IScope application){RegisterSharedObjectSecurity(new SampleSOSecurityHandler());//注册刚才定义的安全处理Handlerreturn base.AppStart(application);}/// <summary>/// 每当有新客户端连接到服务器时,该方法会被触发/// </summary>/// <param name="connection"></param>/// <param name="parameters"></param>/// <returns></returns>public override bool AppConnect(IConnection connection, object[] parameters){string userName=string.Empty, passWord=string.Empty;if (parameters.Length >= 2){userName = parameters[0].ToString();//第一个参数当作用户名passWord = parameters[1].ToString();//第二个参数当作密码}if (userName == "jimmy.yang" && passWord == "123456")//安全性校验{if (base.AppConnect(connection, parameters)){//获取共享对象(position)ISharedObject users_so = GetSharedObject(connection.Scope, "position");if (users_so == null){//创建共享对象CreateSharedObject(connection.Scope, "position", true);users_so = GetSharedObject(connection.Scope, "position");}//更新共享对象users_so.SetAttribute("x", 200);users_so.SetAttribute("y", 200);connection.Client.SetAttribute("clientName", userName); //回传数据到客户端连接return true;}else {RejectClient("连接失败,请检查服务端是否运行正常!");return false;}}else {RejectClient("用户名或密码错误");return false;}          }}
}

最后还要一些配置文件来提供必要的信息,详情见最后的示例源码下载

Flash客户端代码:(几乎跟在FMS环境中完全一样)

import flash.display.StageAlign;
import flash.net.NetConnection;
import flash.events.NetStatusEvent;
import flash.net.SharedObject;
import flash.events.SyncEvent;
import flash.events.MouseEvent;stage.align = StageAlign.TOP_LEFT;var nc:NetConnection = new NetConnection();
var ball_so:SharedObject;
var userName:String = "";
var passWord:String = "";
var remoteUrl:String = "";if (root.loaderInfo.parameters.remotingGatewayPath != null)
{remoteUrl = root.loaderInfo.parameters.remotingGatewayPath;
}
else
{remoteUrl = "rtmp://localhost:1935/SharedBall";
}if (root.loaderInfo.parameters.userName != null)
{userName = root.loaderInfo.parameters.userName;
}
else
{userName = "jimmy.yang";
}if (root.loaderInfo.parameters.passWord != null)
{passWord = root.loaderInfo.parameters.passWord;
}
else
{passWord = "123456";
}this.nc.addEventListener(NetStatusEvent.NET_STATUS,net_status_handler);
this.nc.connect(remoteUrl,userName,passWord);
this.nc.client = this;
this.txtStatus.text = "服务端连接中...";
SharedBall_mc.buttonMode = true;function net_status_handler(e:NetStatusEvent):void
{this.txtStatus.text = "as3 状态:" + e.info.code;if (e.info.code == "NetConnection.Connect.Success"){ball_so = SharedObject.getRemote("position",nc.uri,true);this.ball_so.addEventListener(SyncEvent.SYNC,sync_handler);this.ball_so.connect(this.nc);this.ball_so.client = this;}
}function sync_handler(e:SyncEvent):void
{if (ball_so.data.x == undefined || ball_so.data.y == undefined){SharedBall_mc.x = 100;SharedBall_mc.y = 100;}else{SharedBall_mc.x = ball_so.data.x;SharedBall_mc.y = ball_so.data.y;}
}SharedBall_mc.addEventListener(MouseEvent.MOUSE_DOWN,mouse_down_handler);function mouse_down_handler(e:MouseEvent):void
{SharedBall_mc.startDrag();this.stage.addEventListener(MouseEvent.MOUSE_UP,mouse_up_handler);this.stage.addEventListener(MouseEvent.MOUSE_MOVE,mouse_move_handler);
}function mouse_move_handler(e:MouseEvent):void
{ball_so.setProperty("x",this.mouseX);ball_so.setProperty("y",this.mouseY);trace(ball_so.data.x,ball_so.data.y);
}function mouse_up_handler(e:MouseEvent):void
{SharedBall_mc.stopDrag();this.stage.removeEventListener(MouseEvent.MOUSE_UP,mouse_up_handler);this.stage.removeEventListener(MouseEvent.MOUSE_MOVE,mouse_move_handler);ball_so.send("drop",this.userName);
}function drop(msg:Object):void{this.txtStatus.text = msg.toString();
}

运行截图:

在这个示例中,小球的坐标来自于服务端的共享对象属性值,所以如果一切顺利,在不同的机器上浏览“嵌入有该swf的页面”,当一台机器上拖动小球时,另一台机器上的小球也会随之运动。

示例源代码下载:http://cid-2959920b8267aaca.office.live.com/self.aspx/Flash/FluorineFx^_02.rar

转载于:https://www.cnblogs.com/yjmyzz/archive/2010/08/26/1809432.html

FluorineFx:远程共享对象(Remote SharedObjects)相关推荐

  1. FMS3系列(六):使用远程共享对象(SharedObject)实现多人时时在线聊天(Flex | Flash)

    FMS开发中,经常会使用共享对象来同步用户和存储数据.对于实现广播文字信息实现聊天的支持非常强大,还可以跟踪用户的时时动作,在开发Flash多人在线游戏中的应用也非常广阔. 在使用FMS开发共享对象时 ...

  2. java 远程共享_【原创】(扫盲)远程共享对象SharedObject的用法

    学习fcs也有差不多一个月了,感觉最有特色的东西还是SharedObject. 今天就写个基本的教程关于它,第一次写教程(以前都是看教程-_-),手心都出汗了,心怕写得有错误导读者就惨了 , 斑竹有空 ...

  3. flashcom中远程共享对象SharedObject的用法

    觉得这篇文章比较好,转载回来. 学习fcs也有差不多一个月了,感觉最有特色的东西还是SharedObject. SharedObject有不少东西,本地操作就不说了(相信很多人没接触fcs也用过);就 ...

  4. Flash本地共享对象 SharedObject

    以下内容是对网上一些资料的总结 Flex SharedObject 介绍(转自http://www.eb163.com/club/thread-3235-1-1.html): Flash的本地共享对象 ...

  5. 远程代理模式-Remote Proxy(Java实现)

    远程代理模式-Remote Proxy 服务端通过rmi将对象注册到远程服务, 客户端使用时, 只需要通过rmi协议获取即可, 只要接口统一, 即可不需要知道内部具体实现, 直接调用使用. Compa ...

  6. Terracotta - 分布式共享对象

    Terracotta是一种分布式java集群技术,它巧妙得隐藏了多个分布式JVM带来的复杂性,使得java对象能够透明得在多个JVM集群中进行分享和同步,并能够进行持久化.从某种意义上讲它类似于had ...

  7. FMS关于代理共享对象

    一个代理共享对象是一个remote共享对象,但代替在一个客户机和服务器应用程序之间被共享,代理共享对象是在两个不 同的Flash Media Server应用程序,或是在同一个应用程序的不同实例间被共 ...

  8. 【远程访问与设备重定向】上海道宁为您助您远程共享USB设备与USB设备重定向到远程会话

    USB over Network用于 通过LAN或Internet 与远程USB设备进行通信 远程USB设备可供多个用户共享 当您连接远程共享USB设备时 它们会被识别为 直接连接到本地计算机 USB ...

  9. 局域网中USB远程共享:USB/IP

    USB/IP是一种基于网络的设备共享机制,可将电脑A(server端)连接的USB设备通过网络共享给远程电脑B(client端) USB/IP有很多的实现方式(程序),除了下文中使用的免费程序,还有商 ...

  10. Docker学习:容器间数据挂载与共享 | 远程共享挂载数据卷 | sshfs挂载远程volume | 容器内部通过sshfs访问远程主机 | -v |--volumes-from(实战篇)

    前言 本讲是从Docker系列讲解课程,单独抽离出来的一个小节,主要介绍宿主.容器间数据共享,它的好处自然不言而喻,Tomcat集群就是这么玩儿的(多个tomcat服务,对应一套web应用). 核心原 ...

最新文章

  1. JHipster技术简介
  2. 解决Eclipse狂吃内存的解决方法(转)
  3. mysql 删除重复数据_MySQL查找和删除重复数据
  4. 【TEG第7年】这里有你和你的永不妥协
  5. java位宽_Java的数据类型
  6. mysql新增后默认返回值_mybatis insert、update 、delete默认返回值解释与如何设置返回表主键...
  7. 【转】Android之apk文件签名——keytool 和 jarsigner
  8. 什么是MongoDB
  9. matlab给图像加云,matlab怎么给图像加雾
  10. 直观讲解--RPC调用和HTTP调用的区别
  11. Part.0模糊集表示方法
  12. 证明彼得森图不是平面图
  13. java poi 操作word遇到的问题
  14. 谁说待国企就是养老?前阿里P8总结500页Java成长笔记全网首发!爱了爱了!
  15. 浏览器兼容性总结: IE 火狐 谷歌 360 搜狗
  16. apachezt和mysql关闭_Apache访问控制
  17. java中switch语句用法详解
  18. Python正则表达式 re
  19. settext 下划线_Android TextView 添加下划线的几种方式
  20. 正交化(Orthogonalization)

热门文章

  1. 如何查看json文件数据编码_【阿里】如何把 json 数据转化为 demo.json 并下载文件...
  2. MyBatis和Spring总结
  3. 网上花店java项目_jsp+servlet开发java web网上花店商城系统,后台可配置化,方便修改,也可修改做成其他商城类项目...
  4. Unity3D(四)Camera和SkyBox
  5. Android--UI控件
  6. android studio 中怎么写aspectj代码,Android AOP三剑客之AspectJ
  7. Maven生命周期详解及常用命令
  8. Centos 8 安装和配置 VNC 服务,让 MAC 可以远程桌面管理Centos(linux)
  9. Redis 常见问题 与 常见错误
  10. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_5 mybatis中使用poolead配置连接的原理分析...