Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> socket приходит не полный пакет java to AS3 
V
    Опции темы
mansoff
Дата 11.1.2013, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 5.12.2012

Репутация: нет
Всего: нет



Всем привет,
столкнулся с такой проблеммой на сокетах: java -> as3 доходят не полностью пакеты.

Есть java socket сервер, который просто пересылает приянятые данные на нужный клиент AS3.
И есть клиенты - которые перекидываются JSON Sting. (шлют они их с приличной частотой)
Пакеты примерно по 4000 символов


Сервер использует printStream для отсылки сообщений
Код

...
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
printStream = new PrintStream(socket.getOutputStream(), true, "UTF-8");
...
printStream.println(message+";"); // забиваем строку
printStream.flush(); // и флэшим её


На AS3 данные получаются так

Код

var socket:Socket = new Socket();
socket.addEventListener(ProgressEvent.SOCKET_DATA, dataHandler); // по событию сокета вызывается обработчик

private function dataHandler(e:*):void {
  var str:String = socket.readUTFBytes(socket.bytesAvailable);
  //str - готовая строка из сокета
}


Теперь самое интересное:
запускаю код на Windows - пакеты приходят как надо
запускаю код на unix на мощном сервере - почти все приходят битые 
В любой версии вывод сервера показывает что java  получает пакеты полностью 

Куда копать ошибку?

Обычно бывает из-за того, когда 2 пакета идут друг за другом ...



Это сообщение отредактировал(а) mansoff - 11.1.2013, 15:14
PM MAIL   Вверх
COVD
Дата 11.1.2013, 21:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



наличие в коде bytesAvailable дает повод предположить, что вы читаете строку так, как если бы она приходила целиком и bytesAvailable было равно длине строки. На самом деле строка  может приходить к получателю по одному байту и bytesAvailable  указывает буквально сколько байт получено, но не сколько отправлено. Никакого связи с операционными системами эта распространенная ошибка не имеет. 
PM MAIL   Вверх
mansoff
Дата 15.1.2013, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 5.12.2012

Репутация: нет
Всего: нет



Может кому поможет:
долго мучался, после получения начала пакета, пытался сразу вызвать 
Код

socket.readUTFBytes(tail_bytes);  

т.е получение конца (у меня в начале пакета стоит его длинна), но flash не СИ, нельзя вручную что-то получить,
надо ждать следущий event по ProgressEvent.SOCKET_DATA
в нём будет недостающий конец.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0870 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.