Задать вопрос
@Travious

Как определить, что начался новый пакет и закончился предыдущий?

Допустим, клиент отправляет что-то серверу, а сервер читает в цикле while или асинхронно (BeginRead/EndRead).
И вот 2 разные сообщения от клиента проходят без всякого промежутка.
То есть со стороны клиента это выглядит примерно так:
var tcp = new TcpClient(...);
...
var sr = tcp.GetStream();
sr.Write("{'json_example': 'Apple'}"); //первое сообщение
sr.Write("{'json_example': 'BananaAvocado'}"); //и прямо тотчас же второе


Собственно вопрос: как серверу определить, что закончилось одно сообщение и началось второе?

Решение пришло само собой: перед отправкой самих данных сперва отправлять длину этих самых данных, чтобы сервер знал сколько ему прочитать байт и после скольки байт начнется новый пакет.
Или еще проще: просто ввести фиксированный размер пакетов, скажем 1024 байта.

Но я, как обычно, всем недоволен и опять в своем решении вижу костыль.
Есть ли какой-то способ избежать этого "костыля"? Может в .NET уже есть готовая реализация такого класса? Или все нормально?
  • Вопрос задан
  • 509 просмотров
Подписаться 3 Оценить Комментировать
Ответ пользователя Станислав Силин К ответам на вопрос (4)
В .net есть такие штуки как BinaryReader и BinaryWriter. Если отправить во writer строку на одном конце, то на другом конце reader будет ждать, пока не считает всю строку целиком. Если будет несколько строк, то они считаются последовательно.
Ответ написан
Комментировать