Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > socket приходит не полный пакет java to AS3


Автор: mansoff 11.1.2013, 14:14
Всем привет,
столкнулся с такой проблеммой на сокетах: 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 пакета идут друг за другом ...


Автор: COVD 11.1.2013, 21:14
наличие в коде bytesAvailable дает повод предположить, что вы читаете строку так, как если бы она приходила целиком и bytesAvailable было равно длине строки. На самом деле строка  может приходить к получателю по одному байту и bytesAvailable  указывает буквально сколько байт получено, но не сколько отправлено. Никакого связи с операционными системами эта распространенная ошибка не имеет. 

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

socket.readUTFBytes(tail_bytes);  

т.е получение конца (у меня в начале пакета стоит его длинна), но flash не СИ, нельзя вручную что-то получить,
надо ждать следущий event по ProgressEvent.SOCKET_DATA
в нём будет недостающий конец.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)