Возникли проблемы с последовательной отправкой трех или более пакетов - PullRequest
2 голосов
/ 13 июня 2011

Я пытаюсь реализовать модель клиент / сервер, используя TCpClient, с Networkstream.Write()/Read() функциями отправки / получения байтового массива.

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

Ниже приведен код, который я использую для записи с клиента на сервер.

byte[] buffer = p.toByteArray(level);

stream.Write(buffer, 0, buffer.Length);
stream.Flush();

Это объединяет их или что-то? Я просто не понимаю, как сервер может получать различные массивы, когда я отправляю 2, но не 3 или более. Если я разделю 3 записи, все будет хорошо, но я действительно не хочу этого делать.

Любая помощь будет высоко ценится.

EDIT:

решено :) Спасибо за вашу помощь, ребята. Он выдавал 2-3 пакета за раз, и моя система думала, что 1 пакет = 1 пакет. Я просто переписал мою существующую архитектуру с TCPClient для обнаружения нескольких пакетов :) Еще раз спасибо за помощь!

1 Ответ

1 голос
/ 13 июня 2011

Существует одно очень важное основное правило, которое важно учитывать при программировании сокетов:

Не гарантируется, что независимо от того, что клиент, отправленный в X, пишет, сервер будет получать точно такое же количество операций чтения.,Это может быть одна запись на клиенте и 10 операций чтения на сервере.Это может быть 10 записей и клиент и только одно чтение на сервере.

Допустим, клиент отправляет 3 сообщения по 100 байт каждое.Сервер может получить 150 байтов, а затем еще 150 байтов.Или 100 байтов и 200 байтов.

Единственное, что гарантировано, если вы работаете с TCP, - это то, что порядок будет сохранен, другими словами, что то, что вы отправили первым, будет первым на сервере.

Вы можете использовать один из следующих основных методов для разделения данных:

  • маркеры (некоторая последовательность байтов, разделяющая сообщения)
  • постоянная длина для сообщения
  • длина в заголовке сообщения
  • комбинация вышеперечисленного
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...