![]() |
разрыв пакетов smartsocketserver
Здравствуйте.
Не совсем уверен в правильности формулировки темы, но я не знаю как написать правильнее. Опишу свою проблему. Я использую java smartsocketserver, сервер по запросу от клиента делает из базы выборку и отправляет данные клиенту. Примерно в половине случаев во флешку приходит не один пакет с информацией а два. Идет разрыв данных и обрабатываеться последний полученый пакет что приводит к ошибке. пример трейса когда все ок Код:
SmartSocketClient => Received Код:
SmartSocketClient => Received Буду рад любым предположениям по поиску проблемы. |
Это нормальное поведение. TCP socket - это поток. Т.е. он не гарантирует, что данные отправленные "одним куском" придут тоже одним куском. В правильном порядке, все, что отправляли (либо будет разрыв) - гарантирует, что одним куском - нет. Клейте сами.
|
Благодарю за ответ.
В таком случае возникает еще один логичный вопрос: Как мне знать что полученые пакеты относятся к 1 целому куску отправленой информации и в какой последовательности они должны быть? На даный момент все пакеты доходят в нужной последовательности - по этому я их успешно собираю. как быть в случае если пакеты будут идти в другом порядке(если такое возможно) |
Правильная последовательность гарантирована. Разбивка может быть какой угодно, хоть по байту - протоколу не противоречит.
Основные алгоритмы "склейки" такие: 1) пишешь в сокет длину пакета, пишешь пакет, повторить. При приёме читаешь длину, потом читаешь, пока не придёт нужное кол-во байт (в конце может быть больше чем надо - значит приклеился след. пакет). 2) разделители. Говоришь, что, например символ '\0' - разделитель и читаешь, пока он не придёт. Недостаток - в пакете не может быть символа '\0' (или придумывать ескейпы и иметь соответствующие проблемы). |
Еще раз благодарю за ответ.
По скольку "Правильная последовательность гарантирована" - то вопрос закрыт. Я отправляю с сервера на клиент JSONObject, в клиенте я клею входящие пакеты пока снова не получу валидный JSONObject. |
У вас может получиться валидный JSONObject + кусок следующего JSONObject. (если конец первого склеится со следующим и пришел одним пакетом). Ну и JSONObject - вроде бы строка, у строк есть как раз разделитель '\0'.
|
Похоже, что это посылка пакетов с помощью механизма 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
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.