实现FMS客户端与服务器端直接广播与监听事件框架

先看一下最常见的客户端与服务器端交互的方式call,客户端call服务器的c2s方法,传递数组。服务器call客户端s2c方法,传递数组。如下图

attachments/200908/28_223149_1.jpg


client端方法是被调用在nc.client上的,server端是被调用在client对象上的,所以要把方法定义在Client类的原型链上。如下图,目前为止一切都很正常。

attachments/200908/28_223156_2.jpg


但随着时间的推移,nc.client和Client.prototype这两个地方的方法就越来越多了。。

attachments/200908/28_223201_3.jpg


而且在nc.client的处理函数中还要想办法通知和更新其他的界面元素。导致这里罗列很厚很厚的代码。。。

attachments/200908/28_223207_4.jpg


再看服务器这边也好不了哪去,如果不想在main.asc里写到底,还是要想办法通知其他的类。

attachments/200908/28_223212_5.jpg


我一直在想怎么解决这个问题,后来我想出了这么个办法,拿出来大家研究一下。
我首先把nc的client做成了独立的类叫NCClient,并用了点小技巧把服务器过来的call直接广播出去,这样就可以在ui中直接监听server发来的消息了(见图左半部分)。有了NCClient,同理我又利用之前写的服务器端EventDispatcher类写了个NCServer类,也用了个小技巧把客户端call过来的消息直接广播出去。(如图右半部份)

attachments/200908/28_223220_6.jpg


既然可以使用NCClient类在client端用addEventListener的方式监听到server端的消息,干脆更进一步让NCClient直接可以dispatchEvent事件,于是我又分别在客户端和服务器端用dispatchEvent方法包装了call方法,让其之间可以直接广播和监听FMSEvent了。

attachments/200908/28_223227_7.jpg



这样就可以在客户端与服务器端自由的广播和监听事件了,不需要再用到call了。

看一下实际例子:

客户端:

package
{
  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 )
 {
 
 
 };
 
 


完整代码点此下载

这样是不是方便了呢,欢迎讨论。。

[最后编辑于 N神, at 2009-08-31 18:19:09]
posted @ 2010-05-17 17:06  rob_2010  阅读(325)  评论(0编辑  收藏  举报