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