2013-08-23 74 views
0

我正在尝试使一个简单的P2P网络系统向您的网络上的其他Flash播放器发送消息。AS3 - 只接收“未定义”数据的本地P2P网络

但是,当我发送消息时,接收播放器不会收到消息,而是一个未定义的对象。

顺便说一句,我确实允许Flash Player在我的病毒扫描程序(NOD 32)和Windows防火墙中运行。

这里是我的P2P类:

package com.snakybo.as3framework.network { 
    import flash.events.Event; 
    import flash.events.NetStatusEvent; 
    import flash.net.GroupSpecifier; 
    import flash.net.NetConnection; 
    import flash.net.NetGroup; 

    /** @author Kevin */ 
    public class P2P extends NetConnection { 
     private var netCon:NetConnection; 
     private var netGroup:NetGroup; 

     private var handler:Function; 
     private var groupName:String; 

     public function P2P(groupName:String, handler:Function) { 
      this.groupName = groupName; 
      this.handler = handler; 

      netCon = new NetConnection(); 
      netCon.addEventListener(NetStatusEvent.NET_STATUS, conHandler); 
      netCon.connect("rtmfp:"); 
     } 

     /** Post a message */ 
     public function post(txt:*):void { 
      var data:Object = new Object(); 

      data["txt"] = txt; 
      data["id"] = new Date().time; 

      netGroup.post(data); 
     } 

     /** Handle connection event listener */ 
     private function conHandler(e:NetStatusEvent):void { 
      if(e.info["code"] == "NetConnection.Connect.Success") { 
       setupGroup(); 
      } 
     } 

     /** Connect to group */ 
     private function setupGroup():void { 
      var groupSpec:GroupSpecifier = new GroupSpecifier(groupName); 

      groupSpec.postingEnabled = true; 
      groupSpec.ipMulticastMemberUpdatesEnabled = true; 
      groupSpec.addIPMulticastAddress("225.225.0.1:30000"); 

      netGroup = new NetGroup(netCon, groupSpec.groupspecWithAuthorizations()); 
      netGroup.addEventListener(NetStatusEvent.NET_STATUS, handler); 

      dispatchEvent(new Event(Event.COMPLETE)); 
     } 
    } 
} 

连接似乎是工作,因为我可以发送消息和其他球员不接受他们..好..收到东西。

然后从我的Main.as我调用这个类是这样的:

private var p2p:P2P; 

public function Main():void { 
    p2p = new P2P("snakybo", netHandler); 
    p2p.addEventListener(Event.COMPLETE, onConnected); 
} 

private function onConnected(e:Event):void { 
    function send(e:KeyboardEvent):void { 
     c.post("a"); 
     trace("poseted"); 
    } 

    stage.addEventListener(KeyboardEvent.KEY_DOWN, send); 
} 

private function netHandler(e:NetStatusEvent):void { 
    switch(e.info["code"]) { 
     case "NetGroup.Posting.Notify": 
      trace("received: " + e.info["txt"]); 
      break; 
    } 
} 

另外,如果我补充一下:

case "NetGroup.Connection.Success": 
    trace("Connected to group"); 
    break; 

它永远不会打印出。不知道有什么问题。

我在这里做错了什么吗?或者我的电脑以某种方式阻止Flash Player?

回答

2

在你有这样的P2P类...

netCon.connect("rtmfp:"); 

这告诉你的NetConnection连接到一个字符串(“RTMFP:”),这是不是一个服务器或有效的连接类型,如果你想到达rtmfp连接的外部成员。看起来你正在将它用于内部网络,所以“rtmfp”将在本地工作。

我做些什么的NetConnection.connect()是设置我的RTMFP常数和开发者密钥常数(卷云服务器)马上像这样的蝙蝠...

cons SERVER:String = "rtmfp:"; 
cons DEVKEY:String = "your developer key here"; 

然后

function connect(): void { 
    nc = new NetConnection(); 
    nc.addEventListener(NetStatusEvent.NET_STATUS, netStatus); 
    nc.connect(SERVER + DEVKEY); 
} 

如果您使用他们的rtmfp服务器获取开发人员密钥,您可以前往adobes网站,他们可以免费且轻松地获取。一旦连接,您将得到一个NetStatus事件字符串“NetConnection.Connect.Success”,您的conHandler函数将设置为接收。我用我的内部交换机为例来监听连接字符串,并做基于关每个字符串是这样的:

function netStatus(event: NetStatusEvent): void { 
    switch (event.info.code) { 
      case "NetConnection.Connect.Success": 
     setupGroup(); 
     break; 
} } 

消防您setupGroup()函数,当你听到“值为NetConnection.Connect.Success”。然后你setupGroup()内继续并设置

groupspec.serverChannelEnabled = true; 
groupspec.routingEnabled = true; 
groupspec.objectReplicationEnabled = true; // and I have  
groupspec.peerToPeerDisabled = false; 

而且,在你setupGroup你射击“处理程序”,而不是“conHandler”,这是你的netStatus事件处理函数的名称。可能只是一个错字。设置新的NetGroup本身会触发3个NetStatus事件中的一个,告诉你新的网络组连接的状态,所以你不需要发送你正在使用的事件,除非你愿意,直到你。你也可以在你的conHandler函数中处理它们。

我通常会有一个跟踪语句设置来打印出NetStatusEvent,因此在您的情况下会是... trace(e.info。代码),您将能够在事件发生时看到事件并能够更轻松地解决问题。一旦你建立了这种联系,你就可以处理交付物品。

这应该至少为您创建一个创建的实例以及组中其他人的连接。我已经包括了几个链接我引用在这里: NetGroup NetStatus NetConnection

尝试使用Google汤姆Krcha编写的,他是用土坯,有一些这方面的好消息也是如此。

+0

感谢您对于@ E10的信息如何关于“groupSpec.addIPMulticastAddress(”225.225.0.1:30000“);”你还需要这些吗? – sputn1k

+0

只是测试它,它的工作原理正是我正在寻找..serverChannelEnabled等谢谢分配! – sputn1k

+1

如果您有特定的服务器发送数据,或者您的防火墙过滤了UDP通信,则只需执行此操作。 – E10