1

同じアプリの 2 つのインスタンスを互いに通信させようとすると、ServerSocketConnectEvent が起動しません。これが私のシナリオです:

localhost を介して別のインスタンスと通信する AS3 Adob​​e AIR アプリがあります。どちらのアプリもポートをリッスンし、互いのポートに接続しようとします。つまり、インスタンス 1 はポート 50000 でリッスンし、インスタンス 2 のポート 50001 に接続しようとします。インスタンス 2 はポート 50001 でリッスンし、ポート 50000 に接続しようとします。接続が確立されるまで、アプリは 100 ミリ秒ごとに相互に接続しようとします。RawCap を使用して localhost のデータをキャプチャしたところ、宛先ポート 50000 と 50001 の両方を対象としたパケットのインターリーブが見られました。

私のセットアップは、デバッグ モードで FlashDevelop からアプリを実行し、バンドルされた exe を個別に実行することで構成されています (これに従って、アプリの複数のインスタンスを持つことができます:複数の同じ Adob​​e 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);
}

何か案は?

ありがとう

4

1 に答える 1

1

サーバー ソケットが範囲外になり、ガベージ コレクションが行われているようです。

このメソッドcreateServerSocket()では、サーバー ソケットをローカル変数でインスタンス化しますserverSocket。しかし、同じメソッドは null である m_serverSocket を返します。ローカル変数を返すつもりだったと思いますserverSocket:)

于 2012-12-11T03:17:16.640 に答える