Aug 29

flex4局域网(LAN)的P2P通讯 不指定

bearjia , 10:35 , Flex相关 , 评论(1) , 引用(0) , 阅读(1737) , Via 本站原创 | |
flash在局域网(LAN)建立P2P连接?
其实flash原生就有个IP-only多播!
多播其实是个简单的步骤。

建立一个IP多播连接。指定连接字符串“rtmfp”. 注意,这种方式不能用于一对一通讯。所以不需要设置NetStream为DIRECT_CONNECTIONS,但可以进行RTMFP Group的所有操作。 也就是说,只能群发信息。

没错,就是这个了
netConnection.connect("rtmpf:");


一旦连接成功(返回NetConnection.Connect.Success)就可以通过GroupSpecifier建立NetGroup或NetStream.
再设置ipMulticastMemberUpdatesEnabled为true,负责点与点间建立本地的连接,各点使用多播地址和相应端口调用addIPMulticastAddress方法。

多播地址至少以224为起始值,而端口要大于1024 - 即:224.0.0.0:1024
端口越高越好 —— 唯一性。

废话不多说,下面就是完整的代码。

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
         xmlns:s="library://ns.adobe.com/flex/spark"
         xmlns:mx="library://ns.adobe.com/flex/mx" applicationComplete="connect()">
  <fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
  </fx:Declarations>
  
  <fx:Script>
    <![CDATA[      
      private var nc:NetConnection;
      private var group:NetGroup;
      
      [Bindable]
      private var userName:String;
      
      [Bindable]
      private var connected:Boolean = false;
      
      private function connect():void{
        nc = new NetConnection();
        nc.addEventListener(NetStatusEvent.NET_STATUS, netStatus);
        nc.connect("rtmfp:");
        
        userName = "user"+Math.round(Math.random()*1000);
      }
      
      private function netStatus(event:NetStatusEvent):void{
        writeText(event.info.code);
        
        switch(event.info.code){
          case "NetConnection.Connect.Success":
            setupGroup();
            break;
          
          case "NetGroup.Connect.Success":
            connected = true;
            break;
          
          case "NetGroup.Posting.Notify":
            receiveMessage(event.info.message)
            break;
        }
      }
      
      private function setupGroup():void{
        var groupspec:GroupSpecifier = new GroupSpecifier("myGroup/groupOne");
        groupspec.postingEnabled = true;
        groupspec.ipMulticastMemberUpdatesEnabled = true;
        groupspec.addIPMulticastAddress("225.225.0.1:30303");

        group = new NetGroup(nc,groupspec.groupspecWithAuthorizations());
        group.addEventListener(NetStatusEvent.NET_STATUS,netStatus);
      }
      
      private function sendMessage(txt:String):void{
        var message:Object = new Object();
        message.text = txt;
        message.sender = group.convertPeerIDToGroupAddress(nc.nearID);
        message.userName = txtUser.text;
        
        group.post(message);
        
        receiveMessage(message);
      }
      
      public function receiveMessage(message:Object):void{
        writeText(message.userName+": "+message.text);
      }
      
      private function writeText(txt:String):void{
        txtHistory.text += txt+"\n";
      }
      
      protected function btnSend_clickHandler(event:MouseEvent):void
      {
        sendMessage( txtMessage.text );
      }

    ]]>
  </fx:Script>
  <s:TextInput text="{userName}" x="10" bottom="10" id="txtUser"/>
  <s:TextInput left="146" right="88" bottom="10" id="txtMessage" enter="btnSend_clickHandler(null)"/>
  <s:TextArea left="10" right="10" top="75" bottom="40" id="txtHistory"/>
  <s:Button enabled="{connected}" label="Send" bottom="10" right="10" click="btnSend_clickHandler(event)" id="btnSend"/>


</s:Application>
Tags: ,
求助
2011/10/20 10:19
为什么,我在局域网不能连接呢,请指点一下。非常感谢!
bearjia 回复于 2011/11/05 17:25
防火墙、 路由器不要开启arp过滤等等原因
分页: 1/1 第一页 1 最后页
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]