先看一下最常见的客户端与服务器端交互的方式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了。
看一下实际例子:
客户端:
- package
- {
- import flash.display.Sprite;
- import flash.events.Event;
- import flash.events.NetStatusEvent;
- import flash.net.NetConnection;
- import net.nshen.nflash.com/article/fms' target='_blank'>fms.FMSEvent;
- import net.nshen.nflash.com/article/fms' target='_blank'>fms.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/nflash.com/article/fms' target='_blank'>fms");
- // 监听服务器发过来的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("nflash.com/article/fms' target='_blank'>fms/NCServer.asc")
- load("nflash.com/article/fms' target='_blank'>fms/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 )
- {
- };
完整代码点此下载
这样是不是方便了呢,欢迎讨论。。
