Скорее всего, вы видите мусор из-за структурирования пакетов;TCP только гарантирует, что правильные байты будут поступать в правильном порядке (или сбой потока) - он ничего не говорит о кусках , в которые они поступают.Поэтому vital означает, что вы:
- поймаете возвращаемое значение из
Read
и обработаете только столько байтов из любого куска - выполнить ваше собственное кадрирование - то есть группировать поток в сообщения независимо от того, как куски прибывают
Если ваши сообщения всегда имеют фиксированный размер, то «2» становится «буферными данными, пока я не получупо крайней мере, N байтов, затем обрабатывают данные кусками по N, сохраняя все, что осталось, затем возобновляют буферизацию ".Но в общем случае это может быть «буфер до тех пор, пока я не увижу значение дозорного, например, перевод строки», или «буфер до тех пор, пока у меня не будет полный заголовок, затем проанализируйте заголовок, чтобы увидеть, сколько данных ожидать, затем выполните буфердо тех пор, пока у меня не будет столько данных ".
Существуют инструменты и утилиты, которые помогают упростить де-кадрирование и обработку невыполненных заданий - например, с новым API" конвейеры "это просто случай проверки каналаи сообщая каналу, сколько вы хотите потребить (вместо того, чтобы дать вам все, и у вас нет возможности сейчас отклонить данные), - но переключение с Stream
на «конвейеры» для большинства людей представляет собой довольно незначительный набор изменений.
В вашем случае вы, вероятно, можете использовать:
byte[] bytesFrom = new byte[MAX_SIZE];
int outstanding = MAX_SIZE, read, offset = 0;
while (outstanding > 0 && (read = networkStream.Read(bytesFrom, offset, outstanding)) > 0)
{
offset += read;
outstanding -= read;
}
if (outstanding != 0) throw new EndOfStreamException();
Это создает цикл чтения, который полностью заполняет bytesFrom
или завершается с ошибкой.