Будет ли TCPStream.Read блокироваться, пока ВСЕ данные не будут получены в отправленном сообщении? - PullRequest
4 голосов
/ 12 июня 2011

Я написал многопоточный простой сервер, который использует:

clientStream.Read(message, 0, 4096);

Блокировать, пока клиент не отправит сообщение. Затем код обрабатывает это сообщение.

До сих пор я использовал его только для отправки коротких команд

ex. "#login[username][login]"

но я беспокоюсь, что когда я посылаю огромные данные таблицы по линии, код может продолжаться до того, как он будет получен.

Так будет ли .Читать до тех пор, пока не будет получено все отправленное сообщение, или он разблокируется, когда начнут поступать какие-либо данные?

1 Ответ

7 голосов
/ 12 июня 2011

Недостаточно полагаться на отправку, чтобы завершить разграничение между сообщениями. Если не по самым простым причинам. Я могу подключиться к вашему серверу и легко отключить его.

Вам нужно будет создать проводной протокол. У вас есть несколько вариантов.

  • Всегда ожидайте размер сообщения в виде 32-разрядного целого числа без знака в качестве первых 4 байтов, а затем считывайте, пока не заполните этот объем данных.

  • Укажите разделитель конца сообщения. Это означает, что вы будете поддерживать буфер. Вы заполняете его данными с провода, быстро сканируете его на предмет конца сообщения. Когда вы найдете сообщение, которое вы выбросили, обработчику сообщений, затем продолжите работу с оставшимися байтами в буфере, повторив шаг 1.

Вы можете посмотреть на STOMP для простого текстового протокола.

Не полагайтесь на то, что ваши пакеты отправляются в виде четко определенных кусков в качестве разделителя сообщений.

...