Свойство NetworkStream.CanRead
указывает только на то, что поток поддерживает чтение , вовсе не означает, что данные доступны.При чтении из сети вы всегда должны продолжать чтение, пока не будет завершен весь кадр, где значение кадра полностью зависит от протокола: это может означать заголовок размера преамбулы, терминатор, такой как \ 0x0A, или специальную последовательность, например, одну точкуна линии.Пока фрейм неполный, вы должны продолжать отправлять буферы приема или читать из потока, если используете потоковый API.
Вторая проблема заключается в том, что вы, очевидно, должны ограничивать себя в интерпретации только байтов.Вы получили , а не весь размещенный буфер.NetworkStream.Read
возвращает фактическое число полученных байтов, доступных на данный момент, все, что после этого в буфере, является мусором:
networkStream = clientSocket.GetStream();
int bytesReceived = networkStream.Read(
bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
dataFromClient = System.Text.Encoding.ASCII.GetString(
bytesFrom, 0, bytesReceived);
Это по-прежнему не правильно обрабатывает разделитель кадров, так как вы не знаете, еслиdataFromClient
- это все данные от клиента, но это полностью зависит от протокола.