AMF сокеты не синхронизируются при использовании ServerSocket в AIR - PullRequest
2 голосов
/ 02 марта 2011

У меня есть две (+) системы в локальной сети, на которых запущено приложение 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 Ответ

1 голос
/ 02 марта 2011

Я не думаю, что это проблема с синхронизацией.Пакеты всегда должны быть в правильном порядке.

Я почти уверен, что проблема в том, что вы предполагаете, что каждый вызов 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

...