我在运行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();
}
}
答案 0 :(得分:1)
我不认为这是同步问题。数据包应始终按正确的顺序排列。
我很确定问题在于您假设每个Socket.writeObject
的来电都会作为单个SOCKET_DATA
事件收到,这不一定是真的。您需要做的是发送实际数据的长度和数据。例如:
socket.writeUnsignedByte(lengthOfData);
socket.writeObject(data);
请参阅此示例以编写数据:
用于读取数据的socketDataHandler: https://github.com/magicalhobo/Flash-CS5-mobile-proxy/blob/master/com/magicalhobo/mobile/proxy/MobileClient.as