在AIR中使用ServerSocket时,AMF套接字不同步

时间:2011-03-02 01:08:40

标签: flash flex actionscript-3 actionscript air

我在运行AIR应用程序的本地网络上有两个(+)系统,需要在彼此之间发送/接收更新的位置和其他事件。我目前正在使用基于AIR的套接字服务器实例之一。

AMF和强打字效果很好。但是,客户之间的同步并不是什么。

在下面的示例中, clientA 正在尝试将AMF数据包发送到 clientB 。 SOCKET_DATA事件在服务器上按预期启动,与鼠标同步,但 clientB 非常快速接收的数据不同步且事件丢失。

如果偶尔的事件被删除会很好,但我需要知道最近的SOCKET_DATA事件有最新的数据。相反,它只包含越来越旧的数据。

我在这里发布了一个测试版本(包含源代码):

http://dev.marcelray.com/send/SocketTest.zip

非常感谢任何想法或想法。

谢谢!

代码段:

clientA writeObject:(在MOUSE_MOVE上测试大量事件)

protected function stage_mouseMoveHandler ( pEvent : MouseEvent ) : void
{
    var lOutgoingPacket : DataPacket = new DataPacket( pEvent.stageX , pEvent.stageY );

    clientAStatusText.appendText( "Sending packet: " + lOutgoingPacket + "\n" );

    clientA.writeObject( lOutgoingPacket );
}

clientB SOCKET_DATA处理程序:

private function clientB_socketDataHandler ( pEvent : ProgressEvent ) : void
{
    var lIncomingPacket : DataPacket = DataPacket( clientB.readObject() );  

    clientBStatusText.appendText( "Received packet: " + lIncomingPacket + "\n" );
}

服务器的SOCKET_DATA处理程序:

private function server_socketDataHandler ( pEvent : ProgressEvent ) : void
{
    var lSourceClient : Socket = pEvent.target as Socket;

    var lIncomingObject : * = lSourceClient.readObject(); 

    // Send message to all connectedClients
    for each ( var iClient : Socket in connectedClients )
    {
        // Don't send to client who sent the original command
        if ( iClient == lSourceClient )
            continue;

        iClient.writeObject( lIncomingObject );
        iClient.flush();
    }
}

1 个答案:

答案 0 :(得分:1)

我不认为这是同步问题。数据包应始终按正确的顺序排列。

我很确定问题在于您假设每个Socket.writeObject的来电都会作为单个SOCKET_DATA事件收到,这不一定是真的。您需要做的是发送实际数据的长度和数据。例如:

socket.writeUnsignedByte(lengthOfData);
socket.writeObject(data);

请参阅此示例以编写数据:

https://github.com/magicalhobo/Flash-CS5-mobile-proxy/blob/master/com/magicalhobo/mobile/proxy/ProxyData.as

用于读取数据的socketDataHandler: https://github.com/magicalhobo/Flash-CS5-mobile-proxy/blob/master/com/magicalhobo/mobile/proxy/MobileClient.as