Вопреки тому, что подразумевается в документации для NetworkStream.Read , поток, полученный из TcpClient
, не не просто возвращает 0 для количества прочитанных байтов, когда нет данныхдоступно - блокируется.
Если вы посмотрите документацию для TcpClient
, вы увидите следующую строку:
Класс TcpClient предоставляет простые методы дляподключение, отправка и получение потоковых данных по сети в режиме синхронной блокировки .
Теперь я предполагаю, что если ваш Read
вызов блокирует, то это потому, что сервер имеетрешил не отправлять данные обратно.Вероятно, это связано с тем, что первоначальный запрос не проходит должным образом.
Моим первым предложением было бы устранить StreamWriter
в качестве возможной причины (т.е. нюансы буферизации / кодирования) и записать непосредственно в поток, используяNetworkStream.Write
метод.Если это работает, убедитесь, что вы используете правильные параметры для StreamWriter
.
. Мое второе предложение не должно зависеть от результата вызова Read
для разрыва цикла.Класс NetworkStream
имеет свойство DataAvailable
, предназначенное для этого.Правильный способ написать цикл приема:
NetworkStream netStream = client.GetStream();
int read = 0;
byte[] buffer = new byte[1024];
StringBuilder response = new StringBuilder();
do
{
read = netStream.Read(buffer, 0, buffer.Length);
response.Append(Encoding.ASCII.GetString(buffer, 0, read));
}
while (netStream.DataAvailable);