簡體   English   中英

AS3 - 本地P2P網絡僅接收“未定義”數據

[英]AS3 - Local P2P networking receiving only “undefined” data

我正在嘗試建立一個簡單的P2P網絡系統,以便向網絡上的其他Flash播放器發送消息。

但是,當我發送消息時,接收播放器不會收到消息,而是接收到未定義的對象。

我確實允許在我的病毒掃描程序(NOD 32)和我的Windows防火牆中使用Flash Player。

這是我的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?

在你的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函數已設置為接收。 我在我的內部使用一個Switch Case來監聽連接字符串並根據每個字符串做一些事情,如下所示:

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

當您聽到“NetConnection.Connect.Success”時,觸發setupGroup()函數。 然后在你的setupGroup()中繼續並設置你的

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

此外,在您的setupGroup中,您將觸發“處理程序”而不是“conHandler”,這是您的NetStatus事件函數處理程序的名稱。 可能只是一個錯字。 設置新的NetGroup本身將觸發3個NetStatus事件中的1個,告訴您新的網絡組連接的狀態,因此除非您願意,否則不需要調度您正在使用的事件。 你也可以在你的conHandler函數中處理它們。

我通常會有一個跟蹤語句設置來打印出NetStatusEvent,所以在你的情況下,這將是... trace(e.info.code),你將能夠在事件發生時看到事件,並能夠解決很多問題更輕松。 一旦你建立了這個連接,你就能夠處理對象的傳遞。

這至少應該為您創建一個已創建的實例以及與該組中其他人的連接。 我在這里引用了一些鏈接: NetGroup NetStatus NetConnection

嘗試谷歌搜索湯姆克爾查,他與土坯,並有一些很好的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM