2014-12-19 4 views
0

Я пишу сетевой клиент для данного протокола, используя TCP, и у меня возникли некоторые философские проблемы с общей архитектурой вещи. Иногда бывает, что у меня нет всех данных запроса, и мне может потребоваться прочитать еще несколько байтов, чем то, что доступно на данный момент, и иногда я могу получить части другого запроса после того, что я хочу. Каков обычный подход в подобных ситуациях?Как бороться с несколькими частями сети данных?

+0

1) восстановить сообщение из его частей. например: используйте буфер. 2) убедитесь, что получатель может определить длину сообщения. –

+0

Когда сообщение TCP становится разделенным? Если я напишу x байты, могу ли я убедиться, что в другой части есть x байтов, доступных для чтения? Я не помню, как работает TCP. – user1032861

+0

это поток. вы не можете полагаться на что-то подобное. –

ответ

1

Сокеты TCP ориентированы на поток. Это означает, что чтение их такое же, как чтение файла. Если вы хотите передавать дискретные сообщения через TCP, вам нужно разделить поток данных на сообщения, как и нулевой символ разбивает текстовые файлы на строки. Это называется обрамлением.

Там много способов сделать это, вот несколько примеров:

  1. счетного подход - каждое сообщение с префиксом его длиной. скажем, «5apple». Сначала вы читаете «5», затем знаете, сколько байтов в этом сообщении, и что 6-й байт будет первым байтом следующего сообщения. Может потребоваться несколько байтов длины, если некоторые из ваших сообщений длинны.

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

  3. Сообщения фиксированного размера - аналогичные первому подходу, только если поле длины неявно. Убедитесь, что все ваши сообщения имеют фиксированную длину (при необходимости используйте прокладку), а затем просто читайте правильное количество байтов из сокета каждый раз.

+0

Для сообщений в стиле HTML я должен использовать сочетание 1 и 2, затем ... – user1032861