0

異なるデバイス間のサーバーレス P2P LAN 接続を作成するための簡単な AS3 プログラムを作成しました。その要点は次のとおりです。

クライアント:

private function initLan():void 
    {
        //G is a class with two static variables - netConnection and netGroup
        G.netConnection = new NetConnection();
        G.netConnection.addEventListener(NetStatusEvent.NET_STATUS, setupLAN);
        G.netConnection.connect("rtmfp:");
    }

    private function setupLAN(e:NetStatusEvent):void
    {
        trace(e.info.code);
        switch (e.info.code)
        {
            case "NetGroup.Connect.Failed": 
            case "NetGroup.Connect.Rejected": 
            case "NetConnection.Connect.Rejected": 
            case "NetConnection.Connect.Failed": 
                trace("There was a problem :/\n+" + e.info.code);
                break;

            case "NetConnection.Connect.Success": 
                trace("Setting up LAN group..");
                setupGroup();
                break;

            case "NetGroup.Connect.Success": 
                trace("LAN group successful!");

                //Start bind requests
                beginBindRequests();

                break;

            case "NetGroup.SendTo.Notify":
                var msg:Object = e.info.message;

                if (msg.type == "BIND RESPONSE") {
                    endBindRequests(); //See beginBindRequests();
                    G.netConnection.removeEventListener(NetStatusEvent.NET_STATUS, setupLAN);
                    G.netGroup.removeEventListener(NetStatusEvent.NET_STATUS, setupLAN);

                    //Connection established.
                }

                break;
        }
    }

    private function setupGroup():void
    {
        var groupspec:GroupSpecifier = new GroupSpecifier("LAN CONNECTION");
        groupspec.postingEnabled = true;
        groupspec.routingEnabled = true;
        groupspec.ipMulticastMemberUpdatesEnabled = true;
        groupspec.addIPMulticastAddress("225.225.0.1:30303");

        G.netGroup = new NetGroup(G.netConnection, groupspec.groupspecWithAuthorizations());
        G.netGroup.addEventListener(NetStatusEvent.NET_STATUS,setupLAN);
    }

    private function beginBindRequests():void 
    {
        function requestBind():void {
            G.netGroup.sendToAllNeighbors( { type:"BIND REQUEST" } );
        }

        //Code running requestBind() until endBindRequests() is called
    }

サーバ:

private function initLAN():void
    {
        //G is a class with two static variables - netConnection and netGroup
        G.netConnection = new NetConnection();
        G.netConnection.addEventListener(NetStatusEvent.NET_STATUS, setupLAN);
        G.netConnection.connect("rtmfp:");
    }

    private function setupLAN(e:NetStatusEvent):void
    {
        switch (e.info.code)
        {
            case "NetGroup.Connect.Failed": 
            case "NetGroup.Connect.Rejected": 
            case "NetConnection.Connect.Rejected": 
            case "NetConnection.Connect.Failed": 
                trace("There was a problem :/\n+" + e.info.code);
                break;

            case "NetConnection.Connect.Success": 
                trace("Setting up LAN group..");
                setupGroup();
                break;

            case "NetGroup.Connect.Success": 
                trace("LAN group successful!");

                //Add hot controller function
                G.netConnection.addEventListener(NetStatusEvent.NET_STATUS, bindResponses);
                G.netGroup.addEventListener(NetStatusEvent.NET_STATUS, bindResponses);

                G.netGroup.removeEventListener(NetStatusEvent.NET_STATUS, setupLAN);
                G.netConnection.removeEventListener(NetStatusEvent.NET_STATUS, setupLAN);
                break;
        }
    }

    private function setupGroup():void
    {
        var groupspec:GroupSpecifier = new GroupSpecifier("LAN CONNECTION");
        groupspec.postingEnabled = true;
        groupspec.routingEnabled = true;
        groupspec.ipMulticastMemberUpdatesEnabled = true;
        groupspec.addIPMulticastAddress("225.225.0.1:30303");

        G.netGroup = new NetGroup(G.netConnection,groupspec.groupspecWithAuthorizations());
        G.netGroup.addEventListener(NetStatusEvent.NET_STATUS, setupLAN);
    }

    private function bindResponses(e:NetStatusEvent):void
    {
        detailText.text = e.info.code;
        switch (e.info.code)
        {
            case "NetGroup.SendTo.Notify":
                if (e.info.message.type == "BIND REQUEST")
                {
                    //Send bind response
                    G.netGroup.sendToNearest({type: "BIND RESPONSE"}, e.info.from);
                }
                break;
        }
    }

これは、コンパイルされた swfs の 2 つのインスタンスを同じ PC で実行している場合は正常に機能しますが、クライアントが電話 (AIR でパッケージ化されている - はい、<uses-permission android:name="android.permission.INTERNET" />設定されている) などで実行されていて、サーバーがサーバーで実行されている場合は機能しません。 PC (AIR アプリとしても)。atを
トレースすると、異なるデバイスでは、2 つのインスタンスがお互いを「認識」することさえありません (が起動されることはありません)。 編集:テストしましたが、クライアント/サーバー AIR アプリを実行している 2 台の PC もお互いを認識しません。 最悪の部分は、同じコード (別の FlashDevelop プロジェクトではありますが) が機能したことがあるということです。何とかして。私は完全に困惑し、イライラしています。ヘルプ。お願いします。e.info.codesetupLan()NetGroup.Neighbor.Connect


PS。可能であれば (私はそうではないと考え始めています)、ほとんどのエンドユーザーはアプリを使用するためにそこまで行かないため、ルーター/ファイアウォールの設定に干渉しないソリューションが非常に高く評価されます。さらに、2 つの異なるルーターをテストしましたが、問題は解決しません。

4

1 に答える 1

0

Turns out the problem was with the computer itself, not the coding or deployment. The LAN was being created properly, just on the wrong network. Following the steps in this link solved the problem.

于 2015-01-25T16:41:38.327 に答える