Проблема в том, что вы не можете получать пакеты произвольного размера.Я не вижу в вашем коде ничего, что указывало бы на согласование потоков.TCP является потоковым протоколом, с более низким уровнем, использующим пакеты, потому что это должно.Это означает, что ваши отправляемые данные разбиты на произвольные пакеты.Размер получаемого конечного пакета в значительной степени случайный (если многое находится в буфере) и может даже не переводиться в полноценный UTF8.
This:
while ((i = stream.Read (bytes, 0, bytes.Length))! = 0)
Не читает все данные, отправленные клиентом, но все данные, полученные сервером.Это может быть не полным.
Вам нужно зайти в документацию и сделать домашнее задание, то есть прочитать его.
В нем говорится:
Операция чтениябудет считывать столько данных, сколько доступно, вплоть до количества байтов, указанного параметром size.
По сути, на данный момент данных больше нет.Это может быть там через миллисекунду.Вот почему вам нужно знать, сколько данных нужно прочитать перед их обработкой - либо с вашей собственной структурой пакетов (имеющей флаг длины, например, в первых двух байтах), либо с помощью CLRLF для указания конца строки - так, когда вы получаетеодин, который вы знаете, вы можете обработать все байты раньше.
Упрощенный подход, который вы здесь используете, просто не будет работать, так как передача данных не является мгновенной.Метод Read будет читать все, что кэшируется в получателе, и вы предполагаете, что это в основном все.
В то же время, время не является необходимым, за исключением обработки связанных сокетов.Опять же, документация помогает:
Если данные для чтения недоступны, метод NetworkStream.Read будет блокироваться до тех пор, пока данные не станут доступны.
Таким образом, нет никакого способаэто возвращает 0 за исключением того, что нижележащий сокет был закрыт (и затем он должен выдать исключение).Потому что он будет ждать, пока (некоторые) данные не поступят.
Подсказка: чтение документации - это не излишняя вещь.В вашем случае вы принимаете поведение, которого явно нет в соответствии с документацией.