您好,欢迎来到我要学flash网!登录注册

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

来源:我要学flash网 | 作者:admin | 发表时间:2011-07-13 | 点击:  次

先看一下最常见的客户端与服务器端交互的方式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了。

看一下实际例子:

客户端:
 

  1. package   
  2. {  
  3.   import flash.display.Sprite;  
  4.   import flash.events.Event;  
  5.   import flash.events.NetStatusEvent;  
  6.   import flash.net.NetConnection;  
  7.   import net.nshen.nflash.com/article/fms' target='_blank'>fms.FMSEvent;  
  8.   import net.nshen.nflash.com/article/fms' target='_blank'>fms.NCClient;  
  9.     
  10.   /**  
  11.    * ...  
  12.    * @author nn  
  13.    */ 
  14.   public class Main extends Sprite   
  15.   {  
  16.       
  17.       
  18.     private var _nc:NetConnection = new NetConnection();  
  19.       
  20.     public function Main():void   
  21.     {  
  22.       //创建NCClient  
  23.       _nc.client = new NCClient(_nc);  
  24.       _nc.addEventListener(NetStatusEvent.NET_STATUS , onConnect);  
  25.       _nc.connect("rtmp://localhost/nflash.com/article/fms' target='_blank'>fms");  
  26.         
  27.       // 监听服务器发过来的Server to Client 事件  
  28.       NCClient(_nc.client).addEventListener("s2c" , onStoC)  
  29.     }  
  30.       
  31.     private function onStoC(e:FMSEvent):void   
  32.     {  
  33.  //输出服务器传过来的参数  
  34.       trace("onStoC " + e.parameterList)  
  35.     }  
  36.       
  37.     private function onConnect(e:NetStatusEvent):void   
  38.     {  
  39.       if (e.info.code == "NetConnection.Connect.Success")  
  40.       {  
  41.  //连接成功就向服务器广播一个"c2s"事件,并传递过去一个参数数组[1,2,3,4,5]数组  
  42.  
  43.         NCClient(_nc.client).dispatchEvent(new FMSEvent("c2s",[1,2,3,4,5]))  
  44.           
  45.       };  
  46.     }  
  47.       
  48.  
  49.       
  50.   }  
  51.     
  52. }  


服务器端:
 

  1. /*  
  2.  * main.asc  
  3.  * author: nn  
  4.  * created on: 2009-8-27 23:42  
  5.  */ 
  6.  
  7.  //导入NCServer和FMSEvent类  
  8.  load("nflash.com/article/fms' target='_blank'>fms/NCServer.asc")  
  9.  load("nflash.com/article/fms' target='_blank'>fms/FMSEvent.asc")  
  10.  
  11.  application.allowDebug = true 
  12.  
  13.  application.onAppStart = function()  
  14.  {  
  15.    
  16.    //监听来自客户端的事件,参数(事件名,处理作用域,处理函数名(字符串类型) )  
  17.    NCServer.getInstance().addEventListener("c2s" , this , "onC2S")  
  18.      
  19.  };  
  20.    
  21.  // 事件处理函数  
  22.  application.onC2S = function(e)  
  23.  {  
  24.    // e.target为发送事件的client ,e.type就是客户端广播的事件名喽 , e.parameterList 就是参数数组 这里应该输出客户端传过来的 123456  
  25.    trace(e.type + " -- " + e.parameterList +" -- "+ e.target)  
  26.  
  27.    //收到后我们再发送一个s2c (server to client)事件发送回e.target,并传递参数数组为 678910  
  28.    NCServer.getInstance().dispatchEvent(new FMSEvent("s2c" , e.target , [6,7,8,9,10]))  
  29.  }  
  30.    
  31.  application.onAppStop = function()   
  32.  {  
  33.      
  34.  };  
  35.    
  36.  application.onConnect = function( p_client )  
  37.  {  
  38.      
  39.    this.acceptConnection(p_client);  
  40.      
  41.    //this.rejectConnection(p_client)  
  42.  };  
  43.     
  44.  application.onDisconnect = function( p_client )  
  45.  {  
  46.    
  47.    
  48.  };  


完整代码点此下载

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

    顶一下
    (0)
    0%
    踩一下
    (0)
    0%
    本文引用地址:
    上一篇:用FlashDevelop写SSAS
    下一篇:没有了
      最新评论: 共有位网友发表了评论
      发表评论:
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    评价:
    表情:
    用户名: 密码: 验证码: