TcpClient.GetStream()
возвращает NetworkStream
, который не поддерживает поиск, поэтому вы не можете изменить указатель считывателя, и до тех пор, пока соединение открыто, оно никогда не заканчивается в конце. Это означает, что метод StreamReader.Peek()
может возвращать вводящее в заблуждение -1
при наличии задержки от сервера между ответами.
Один надежный способ получить ответ - установить тайм-аут чтения и просто продолжать цикл до тех пор, пока не будет сгенерировано исключение, которое вы можете перехватить и продолжить. Поток все еще будет доступен для отправки другого сообщения.
s.ReadTimeout = 1000;
try
{
sw.WriteLine(sendMsg);
while(true)
{
r = sr.ReadLine();
Console.WriteLine(r);
}
sr.DiscardBufferedData();
}
catch(IOException)
{
//Timed out—probably no more to read
}
ОБНОВЛЕНИЕ : может также работать следующее, и в этом случае вам не нужно беспокоиться об установке таймаутов или перехвате исключений:
while(true)
{
r = sr.ReadLine();
Console.WriteLine(r);
if (sr.Peek() < 0) break;
}