2012-12-11 2 views
1

동일한 응용 프로그램의 두 인스턴스가 서로 이야기하려고 할 때 ServerSocketConnectEvent가 실행되지 않습니다. 내 시나리오는 다음과 같습니다.Adobe AIR : ServerSocketConnectEvent가 로컬 호스트 연결을 위해 실행되지 않음

localhost를 통해 다른 인스턴스와 통신하는 AS3 Adobe AIR 앱이 있습니다. 두 응용 프로그램은 포트에서 수신 대기하고 서로 다른 포트에 연결하려고합니다. 즉, 인스턴스 1은 포트 50000에서 수신 대기하고 인스턴스 2의 포트 50001에 연결하려고 시도합니다.이 포트 2는 포트 50001에서 수신 대기하고 포트 50000에 연결하려고 시도합니다. 연결이 설정 될 때까지 응용 프로그램은 100ms마다 서로 연결을 시도합니다. RawCap을 사용하여 로컬 호스트의 데이터를 캡처했으며 대상 포트 50000과 50001에 대한 패킷의 인터리빙을 확인했습니다.

내 설정은 FlashDevelop에서 디버그 모드로 실행하고 번들로 EXE를 실행하는 것으로 구성됩니다 이 응용 프로그램의 여러 인스턴스를 가질 수 있습니다 : How to get ability to start up multiple same Adobe Air applications?). ServerSocketConnectEvent.CONNECT fire가 표시되지 않습니다. 다음은 관련 코드입니다.

// 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); 
} 

아이디어가 있습니까? 그것은 당신의 서버 소켓과 같은

감사

답변

1

는 범위의 외출 및 쓰레기 수집.

createServerSocket() 메서드에서 로컬 변수 serverSocket으로 서버 소켓을 인스턴스화합니다. 그러나 동일한 메소드는 null 인 m_serverSocket을 반환합니다. 로컬 변수를 반환하겠다고 생각했습니다. serverSocket :)

+0

감사합니다. 내가 직접 쏘는 동안은 실례합니다. –