正嘗試從TcpClient
類獲取遠程主機的某些文本。想要遍歷stream.Read
,直到我獲得所有數據。如果我使用bytesRead > 0
它只是掛起。如果我運行這段代碼,我只能得到遠程主機的第一行輸出,並且程序正常退出。但是,如果我在do循環的第一行中斷,並在調試器中手動逐步執行每次迭代,那麼我最終會得到所有行,就像我期望的那樣。我不明白爲什麼會出現這種情況。這是我使用的代碼:TcpClient不返回所有行
TcpClient client = new TcpClient("myserver.net", 1234);
NetworkStream stream = client.GetStream();
Byte[] buffer = new Byte[256];
StringBuilder sb = new StringBuilder();
int bytesRead;
do
{
bytesRead = stream.Read(buffer, 0, buffer.Length);
sb.Append(System.Text.Encoding.ASCII.GetString(buffer, 0, bytesRead));
} while (bytesRead == 256);
只是添加,如果我刻意等待額外的時間似乎得到我想要的每一次迭代,但我不明白爲什麼會這樣......
StringBuilder sb = new StringBuilder();
int bytesRead;
do
{
System.Threading.Thread.Sleep(500);
bytesRead = stream.Read(buffer, 0, buffer.Length);
sb.Append(System.Text.Encoding.ASCII.GetString(buffer, 0, bytesRead));
} while (bytesRead == 256);
使用'StreamReader' – SLaks
'而(bytesRead == 256)'可能是出了什麼問題,因爲網絡流可能不會在發送給您的所有數據一次,它可能應該是'while(bytesRead!= 0)',至少,儘管這是假定Read()塊。 –
另外sb.Append()可能會緩衝數據,這就是爲什麼你看不到它。如果它的Read()塊並且從不返回0,那麼它將永遠阻塞,除非服務器關閉連接。 –