![]() |
|
||||||||||
|
|||||
|
Регистрация: Dec 2010
Сообщений: 18
|
Здравствуйте.
Не совсем уверен в правильности формулировки темы, но я не знаю как написать правильнее. Опишу свою проблему. Я использую 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}]
Буду рад любым предположениям по поиску проблемы. |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Это нормальное поведение. TCP socket - это поток. Т.е. он не гарантирует, что данные отправленные "одним куском" придут тоже одним куском. В правильном порядке, все, что отправляли (либо будет разрыв) - гарантирует, что одним куском - нет. Клейте сами.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. Последний раз редактировалось -De-; 14.09.2011 в 13:39. |
|
|||||
|
Регистрация: Dec 2010
Сообщений: 18
|
Благодарю за ответ.
В таком случае возникает еще один логичный вопрос: Как мне знать что полученые пакеты относятся к 1 целому куску отправленой информации и в какой последовательности они должны быть? На даный момент все пакеты доходят в нужной последовательности - по этому я их успешно собираю. как быть в случае если пакеты будут идти в другом порядке(если такое возможно) Последний раз редактировалось da_potap; 14.09.2011 в 14:57. |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Правильная последовательность гарантирована. Разбивка может быть какой угодно, хоть по байту - протоколу не противоречит.
Основные алгоритмы "склейки" такие: 1) пишешь в сокет длину пакета, пишешь пакет, повторить. При приёме читаешь длину, потом читаешь, пока не придёт нужное кол-во байт (в конце может быть больше чем надо - значит приклеился след. пакет). 2) разделители. Говоришь, что, например символ '\0' - разделитель и читаешь, пока он не придёт. Недостаток - в пакете не может быть символа '\0' (или придумывать ескейпы и иметь соответствующие проблемы).
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
Регистрация: Dec 2010
Сообщений: 18
|
Еще раз благодарю за ответ.
По скольку "Правильная последовательность гарантирована" - то вопрос закрыт. Я отправляю с сервера на клиент JSONObject, в клиенте я клею входящие пакеты пока снова не получу валидный JSONObject. |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
У вас может получиться валидный JSONObject + кусок следующего JSONObject. (если конец первого склеится со следующим и пришел одним пакетом). Ну и JSONObject - вроде бы строка, у строк есть как раз разделитель '\0'.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
Регистрация: Jan 2010
Сообщений: 211
|
Похоже, что это посылка пакетов с помощью механизма chanked.
Во-первых, этот параметр может варьироваться (как-то возился с этим и сам устанавливал размер пакетов). Второе - они действительно разделяются нуль-последовательностью (насчет "\0" не знаю, может оно же, но обычно "\r\n"). Возможно, ты получаешь пакеты в таком виде: 1-вый: "\r\n5639\r\nНекоторая последовательность символов длиной около 4 килобайтов. ... за" 2-ой: "тем идет еще кусок, который заканчивается нуль-последовательностью\r\n" |
![]() |
![]() |
Часовой пояс GMT +4, время: 12:37. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| smartsocketserver |
| Опции темы | |
| Опции просмотра | |
|
|