2013-08-23 72 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