同じアプリの 2 つのインスタンスを互いに通信させようとすると、ServerSocketConnectEvent が起動しません。これが私のシナリオです:
localhost を介して別のインスタンスと通信する AS3 Adobe AIR アプリがあります。どちらのアプリもポートをリッスンし、互いのポートに接続しようとします。つまり、インスタンス 1 はポート 50000 でリッスンし、インスタンス 2 のポート 50001 に接続しようとします。インスタンス 2 はポート 50001 でリッスンし、ポート 50000 に接続しようとします。接続が確立されるまで、アプリは 100 ミリ秒ごとに相互に接続しようとします。RawCap を使用して localhost のデータをキャプチャしたところ、宛先ポート 50000 と 50001 の両方を対象としたパケットのインターリーブが見られました。
私のセットアップは、デバッグ モードで FlashDevelop からアプリを実行し、バンドルされた exe を個別に実行することで構成されています (これに従って、アプリの複数のインスタンスを持つことができます:複数の同じ Adobe Air アプリケーションを起動する機能を取得するにはどうすればよいですか? )。ServerSocketConnectEvent.CONNECT が発生していません。関連するコードを次に示します。
// triggered by clicking on a sprite
public function onClickConnect(event:MouseEvent):void
{
m_connect.disable();
m_serverSocket = createServerSocket(int(m_localPortText.text));
m_remoteSocket = new Socket();
m_remoteSocket.addEventListener(Event.CONNECT, connectionMade);
m_remoteSocket.addEventListener( Event.CLOSE, connectionClosed );
m_remoteSocket.addEventListener( IOErrorEvent.IO_ERROR, socketFailure );
m_remoteSocket.addEventListener( SecurityErrorEvent.SECURITY_ERROR, securityError );
//m_remoteSocket.addEventListener( ProgressEvent.SOCKET_DATA, dataReceived);
m_retryTimer = new Timer(100);
m_retryTimer.addEventListener(TimerEvent.TIMER, connectToRemote);
m_retryTimer.start();
}
// this retries connecting to the remote client
public function connectToRemote(event:TimerEvent):void
{
try
{
//Try to connect
m_remoteSocket.connect( "127.0.0.1", int(m_remotePortText.text));
}
catch( e:Error ) { trace( e ); }
}
public function createServerSocket(port:int):Socket
{
try
{
// Create the server socket
var serverSocket:ServerSocket = new ServerSocket();
// Add the event listener
serverSocket.addEventListener( ServerSocketConnectEvent.CONNECT, gotConnection );
//serverSocket.addEventListener( Event.CLOSE, onClose );
serverSocket.bind(port, "127.0.0.1" );
// Listen for connections
serverSocket.listen();
// this prints fine
trace("Listening on " + serverSocket.localAddress + ":" + serverSocket.localPort);
}
catch (e:Error)
{
trace(e);
}
return m_serverSocket;
}
// this is for connections from clients
// it never fires
public function gotConnection(event:ServerSocketConnectEvent):void
{
//The socket is provided by the event object
m_serverSocket = event.socket;
trace("Connected to client");
}
// this is for connecting to the other app
public function connectionMade(event:Event):void
{
trace(event);
m_retryTimer.stop();
}
public function socketFailure(event:IOErrorEvent):void
{
trace(event);
}
public function connectionClosed(event:Event):void
{
trace(event);
}
public function securityError(event:SecurityErrorEvent):void
{
trace(event);
}
何か案は?
ありがとう