Тема: Erlang <-> Flash
Показать сообщение отдельно
Старый 19.03.2012, 14:39
Djay вне форума Посмотреть профиль Отправить личное сообщение для Djay Найти все сообщения от Djay
  № 1  
Ответить с цитированием
Djay

Регистрация: Feb 2012
Сообщений: 11
По умолчанию Erlang <-> Flash

Добрый день! Возникла проблема с протоколом передачи данных между флешовым клиентом и сервером на Erlang'e организованном через сериализованные amf объекты. Проблема в следующем: клиент отправляет данные на сервер в канал, а канал рассылает всем подключенным к нему пользователям, аналогия - чат, чат комната.

Изначально была первая проблема вызванная наглингом при отправке, если с сервера отправлялось практически одновременно несколько пакетов. Проблема решилась с помощью настроки TCP_NODELAY сокета на сервере. Склеивание исчезло и сниффер теперь показывает, что на компьютер клиента все приходит в нужном количестве и по нужному порту. И визуально содержимое похоже на правду. Но сама именно флешка прочитывает из сокета только один объект, игнорируя полностью второй, хотя при менее активной передаче данных с выключенным TCP_NODELAY такого не наблюдалось.

Код реализации сокетов на флешке:
Код AS3:
public static var socket:Socket;
 
public static function init(ip:String, port:int):void {
   socket = new Socket();
   configureListeners(socket);
   socket.connect(ip, port);
}
 
private static function configureListeners(dispatcher:IEventDispatcher):void {
   dispatcher.addEventListener(Event.CLOSE, closeHandler);
   dispatcher.addEventListener(Event.CONNECT, cnntHandler);
   dispatcher.addEventListener(ProgressEvent.SOCKET_DATA, onData);
   dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
   dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);
   dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
  }
 
private static function onData(event:ProgressEvent) : void {
    var data:Object = socket.readObject();
}
Я не думаю конечно, что с TCP_NODELAY может что-то перестать доотправляться, причем это поведение периодическое, то все хорошо, то потери во флешке. Если кто-нибудь сталкивался с этим, напишите плиз как с этим бороться.

Добавлено через 35 минут
Нашел решение проблемы, будет полезно:
Код AS1/AS2:
while(true) {
    try {
     var data:Object = socket.readObject();
    } catch (e:Error) {
     break;
    }
   .. обработка объекта
}