我在寫一個C#客戶端應用程序,它將連接到用python編寫的服務器。我的問題是關於循環接收數據。應用程序結構全部關於客戶端請求服務器 - >服務器響應客戶端。當消息低於實際緩衝區大小(在服務器中設置)時,一切正常。例如:服務器端緩衝區:1024,客戶端緩衝區大小:256,數據長度< 1kb。運行我用下面的代碼應用:在循環中接收網絡數據的正確方法
int datacounter = 0;
byte[] recived = new byte[256];
StringBuilder stb = new StringBuilder();
serverStream.ReadTimeout = 1500;
try
{
while ((datacounter = serverStream.Read(recived, 0, 256)) > 0)
{
Console.WriteLine("RECIVED: " + datacounter.ToString());
stb.append(System.Text.Encoding.UTF8.GetString(recived, 0, datacounter));
}
}
catch { Console.WriteLine("Timeout!"); }
然後應用程序接收數據,在4個循環(每個256個字節):
RECIVED: 256
RECIVED: 256
RECIVED: 256
RECIVED: 96
然後超時蜱,即結束該傳輸並通過完整數據以後分析(來自stb對象)。我不認爲使用超時是正確的,但我不知道有任何其他方式來做到這一點。 但是,這種方式起作用。下面我們以示例爲例,它不包含: 服務器端緩衝區:1024,客戶端緩衝區:256,數據長度〜8kbytes(python端在循環中發送數據)。
RECIVED: 256
RECIVED: 256
RECIVED: 256
RECIVED: 256
然後超時滴答(顯然數據不完整 - 得到8kb的1kb)。有時循環甚至在1次運行後結束,28個recived字節,並且在超時之前。 Python表示數據已經正確發送。下面是我創建套接字和serverStream對象的方式:
TcpClient clientSocket = new TcpClient();
clientSocket.Connect("x.y.z.x", 1234);
NetworkStream serverStream = clientSocket.GetStream();
它不是TcpClient故障。嘗試與清除套接字一樣,創建像:
但是,它的工作原理類似。有沒有辦法,讓我的循環無超時工作,接收所有數據?如果可能,我想保持套接字同步。
這是套接字讀取超時異常。 –
好的抱歉,我沒有趕上serverStream.Timeout屬性。你完全確定這不是客戶問題嗎? 你可以使用Wireshark來嗅探,看看是否確實有超過1.5秒的超時。 – CharlieBrown
Wireshark聽起來像一個好主意,我稍後會嘗試。我很確定這是一個客戶端問題,使用python編寫的類似客戶端根本沒有任何問題。今天還重新安裝了.NET,以檢查它是否沒有損壞 - 事實並非如此。關於你的編輯 - 如果最後一個數據包偶然會長256? :] –