下面的工作正常,當有數據返回。然而,在下面的stream.read()掛起時返回一個空的流是有效的。我如何重構它以迎合這兩種情況?.NET TcpClient空&非空返回流
using(TcpClient client = new TcpClient(_server, _port))
using(NetworkStream stream = client.GetStream())
{
stream.Write(data, 0, data.Length);
byte[] myReadBuffer = new byte[1024];
int numberOfBytesRead = 0;
var message = new List<Byte>();
do{
numberOfBytesRead = stream.Read(myReadBuffer, numberOfBytesRead, myReadBuffer.Length);
message.AddRange(myReadBuffer.Take(numberOfBytesRead));
}
while(stream.DataAvailable);
return message.ToArray();
}
你的理解是正確的。不幸的是,這兩種情況下,代碼現在在.CopyTo處被阻塞。我認爲這可能是NetworkStream特有的。 – 2015-02-07 18:46:05
@MylesMcDonnell:如果'CopyTo()'阻塞,那麼遠程端點就會行爲不端。即它應該在完成發送時對連接進行優雅的關閉。請注意,假定流程是「連接,發送所有數據,關閉連接」。如果您希望保持連接打開,以便稍後可以發送更多數據,則需要更改協議,以便有機制在同一個連接上對單個傳輸進行分隔(例如,以字節長度傳輸之前) – 2015-02-07 18:49:28
關於異步的有趣點IO;響應流只是一個任意長度的byte [],不需要以任何方式解釋/解析。 – 2015-02-07 18:50:48