Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   разрыв пакетов smartsocketserver (http://www.flasher.ru/forum/showthread.php?t=167912)

da_potap 14.09.2011 13:15

разрыв пакетов smartsocketserver
 
Здравствуйте.
Не совсем уверен в правильности формулировки темы, но я не знаю как написать правильнее. Опишу свою проблему.
Я использую java smartsocketserver, сервер по запросу от клиента делает из базы выборку и отправляет данные клиенту. Примерно в половине случаев во флешку приходит не один пакет с информацией а два. Идет разрыв данных и обрабатываеться последний полученый пакет что приводит к ошибке.

пример трейса когда все ок
Код:

SmartSocketClient => Received
this.bytesAvailable = 5639
SmartSocketClient => Received ["onGetCreatureListHandler",{ Some data}]

пример трейс а когда все не хорошо
Код:

SmartSocketClient => Received
this.bytesAvailable = 4380
SmartSocketClient => Received ["onGetCreatureListHandler",{some data begin
this.bytesAvailable = 1259
SmartSocketClient => Received some data end}]

Разрыв всегда на том же месте (this.bytesAvailable = 4380) этот параметр всегда одинаков. В трейсе на сервере изменений не наблюдается.

Буду рад любым предположениям по поиску проблемы.

-De- 14.09.2011 13:35

Это нормальное поведение. TCP socket - это поток. Т.е. он не гарантирует, что данные отправленные "одним куском" придут тоже одним куском. В правильном порядке, все, что отправляли (либо будет разрыв) - гарантирует, что одним куском - нет. Клейте сами.

da_potap 14.09.2011 14:07

Благодарю за ответ.
В таком случае возникает еще один логичный вопрос:
Как мне знать что полученые пакеты относятся к 1 целому куску отправленой информации и в какой последовательности они должны быть?

На даный момент все пакеты доходят в нужной последовательности - по этому я их успешно собираю. как быть в случае если пакеты будут идти в другом порядке(если такое возможно)

-De- 14.09.2011 15:08

Правильная последовательность гарантирована. Разбивка может быть какой угодно, хоть по байту - протоколу не противоречит.
Основные алгоритмы "склейки" такие:
1) пишешь в сокет длину пакета, пишешь пакет, повторить. При приёме читаешь длину, потом читаешь, пока не придёт нужное кол-во байт (в конце может быть больше чем надо - значит приклеился след. пакет).
2) разделители. Говоришь, что, например символ '\0' - разделитель и читаешь, пока он не придёт. Недостаток - в пакете не может быть символа '\0' (или придумывать ескейпы и иметь соответствующие проблемы).

da_potap 14.09.2011 15:52

Еще раз благодарю за ответ.
По скольку "Правильная последовательность гарантирована" - то вопрос закрыт.
Я отправляю с сервера на клиент JSONObject, в клиенте я клею входящие пакеты пока снова не получу валидный JSONObject.

-De- 14.09.2011 16:20

У вас может получиться валидный JSONObject + кусок следующего JSONObject. (если конец первого склеится со следующим и пришел одним пакетом). Ну и JSONObject - вроде бы строка, у строк есть как раз разделитель '\0'.

Dimitry_II 14.09.2011 21:44

Похоже, что это посылка пакетов с помощью механизма chanked.
Во-первых, этот параметр может варьироваться (как-то возился с этим и сам устанавливал размер пакетов). Второе - они действительно разделяются нуль-последовательностью (насчет "\0" не знаю, может оно же, но обычно "\r\n").

Возможно, ты получаешь пакеты в таком виде:
1-вый: "\r\n5639\r\nНекоторая последовательность символов длиной около 4 килобайтов. ... за"
2-ой: "тем идет еще кусок, который заканчивается нуль-последовательностью\r\n"


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

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