实现FMS客户端与服务器端直接广播与监听事件框架
先看一下最常见的客户端与服务器端交互的方式call,客户端call服务器的c2s方法,传递数组。服务器call客户端s2c方法,传递数组。如下图
client端方法是被调用在nc.client上的,server端是被调用在client对象上的,所以要把方法定义在Client类的原型链上。如下图,目前为止一切都很正常。
但随着时间的推移,nc.client和Client.prototype这两个地方的方法就越来越多了。。
而且在nc.client的处理函数中还要想办法通知和更新其他的界面元素。导致这里罗列很厚很厚的代码。。。
再看服务器这边也好不了哪去,如果不想在main.asc里写到底,还是要想办法通知其他的类。
我一直在想怎么解决这个问题,后来我想出了这么个办法,拿出来大家研究一下。
我首先把nc的client做成了独立的类叫NCClient,并用了点小技巧把服务器过来的call直接广播出去,这样就可以在ui中直接监听server发来的消息了(见图左半部分)。有了NCClient,同理我又利用之前写的服务器端EventDispatcher类写了个NCServer类,也用了个小技巧把客户端call过来的消息直接广播出去。(如图右半部份)
既然可以使用NCClient类在client端用addEventListener的方式监听到server端的消息,干脆更进一步让NCClient直接可以dispatchEvent事件,于是我又分别在客户端和服务器端用dispatchEvent方法包装了call方法,让其之间可以直接广播和监听FMSEvent了。
这样就可以在客户端与服务器端自由的广播和监听事件了,不需要再用到call了。
看一下实际例子:
客户端:
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.NetStatusEvent;
import flash.net.NetConnection;
import net.nshen.nfms.FMSEvent;
import net.nshen.nfms.NCClient;
/**
* ...
* @author nn
*/
public class Main extends Sprite
{
private var _nc:NetConnection = new NetConnection();
public function Main():void
{
//创建NCClient
_nc.client = new NCClient(_nc);
_nc.addEventListener(NetStatusEvent.NET_STATUS , onConnect);
_nc.connect("rtmp://localhost/nfms");
// 监听服务器发过来的Server to Client 事件
NCClient(_nc.client).addEventListener("s2c" , onStoC)
}
private function onStoC(e:FMSEvent):void
{
//输出服务器传过来的参数
trace("onStoC " + e.parameterList)
}
private function onConnect(e:NetStatusEvent):void
{
if (e.info.code == "NetConnection.Connect.Success")
{
//连接成功就向服务器广播一个"c2s"事件,并传递过去一个参数数组[1,2,3,4,5]数组
NCClient(_nc.client).dispatchEvent(new FMSEvent("c2s",[1,2,3,4,5]))
};
}
}
}
服务器端:
* main.asc
* author: nn
* created on: 2009-8-27 23:42
*/
//导入NCServer和FMSEvent类
load("nfms/NCServer.asc")
load("nfms/FMSEvent.asc")
application.allowDebug = true
application.onAppStart = function()
{
//监听来自客户端的事件,参数(事件名,处理作用域,处理函数名(字符串类型) )
NCServer.getInstance().addEventListener("c2s" , this , "onC2S")
};
// 事件处理函数
application.onC2S = function(e)
{
// e.target为发送事件的client ,e.type就是客户端广播的事件名喽 , e.parameterList 就是参数数组 这里应该输出客户端传过来的 123456
trace(e.type + " -- " + e.parameterList +" -- "+ e.target)
//收到后我们再发送一个s2c (server to client)事件发送回e.target,并传递参数数组为 678910
NCServer.getInstance().dispatchEvent(new FMSEvent("s2c" , e.target , [6,7,8,9,10]))
}
application.onAppStop = function()
{
};
application.onConnect = function( p_client )
{
this.acceptConnection(p_client);
//this.rejectConnection(p_client)
};
application.onDisconnect = function( p_client )
{
};
完整代码点此下载
这样是不是方便了呢,欢迎讨论。。