Проблема в том, что клиенты и сервер взаимодействуют друг с другом.Сервер использует BinaryReader
и BinaryWriter
, а клиенты записывают / читают байты в «сырой» поток как есть.Разница в том, что BinaryWriter
записывает не только string
байта, но также его байты длины перед самим string
и BinaryReader
не читает все доступные в настоящее время байты из сети и преобразует их в string
, но читаетсначала длина, а затем - чтение точного количества байтов, необходимого для получения полного string
.
Так что самым простым будет использование BinaryWriter
и BinaryReader
везде, поскольку они могут читать сложные данные (string
) байты, кодирование и декодирование их для вас.
Хотя реализация собственного протокола связи и непосредственная работа с NetworkStream
методами чтения / записи байтов дает вам большую гибкость, для его правильной работы требуются дополнительные усилия.,Например, существует один метод для чтения нескольких байтов из сети
int Read(byte[] buffer, int offset, int size)
Когда сервер отправляет string
, клиент не знает, сколько байтов он должен прочитать.Это может создать большой буфер, который может содержать некоторое разумное количество байтов.Но если сервер отправляет две строки одну за другой, клиент может прочитать их обе в буфер одновременно, и данные могут быть уже повреждены.На этом этапе вам необходимо реализовать свой протокол связи для отправки полных сообщений по сети.Еще одна оговорка для метода Read
заключается в том, что он может считывать не все доступные на данный момент данные из сети одновременно, а значение size
не гарантирует количество прочитанных байтов.Например, вы знаете, что сервер отправляет клиенту n
байтов, а клиент читает их
stream.Read(buffer, 0, n)
Возможно, что клиент будет читать только некоторую часть этих байтов за один Read
вызов, а оставшаяся часть будет по-прежнемубыть в сети, доступной для чтения.Вы должны учесть это и справиться с этой ситуацией, читая байты в цикле, пока нужно прочитать необходимое количество.