Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Erlang <-> Flash (http://www.flasher.ru/forum/showthread.php?t=176857)

Djay 19.03.2012 14:39

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;
    }
  .. обработка объекта
}


Psycho Tiger 19.03.2012 21:14

Код AS3:

while (socket.bytesAviable)



Часовой пояс GMT +4, время: 12:44.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.