我有一個關於通過TCP類發送和接收消息的順序的簡單問題,我找不到任何100%的答案,我的英文不夠好。TCPClient和TCPListener - NetworkStream - 消息順序
如果我有下面的例子:
服務器:
IPAddress IP = IPAddress.Parse("127.0.0.1");
int Port = 13000;
TcpListener Server = new TcpListener(IP, Port);
TcpClient Client = Server.AcceptTcpClient();
NetworkStream Stream = Client.GetStream();
Stream.Write(Buffer1, 0, 4);
//random time
Stream.Write(Buffer2, 0, 4);
//random time
Stream.Write(Buffer3, 0, 4);
和客戶端:
TCPClient Client = new TcpClient("127.0.0.1", 13000);
NetworkStream Stream = Client.GetStream();
Stream.Read(A, 0, 4);
//random time
Stream.Read(B, 0, 4);
//random time
Stream.Read(C, 0, 4);
是不是100%肯定,我將得到A = BUFFER1,B = BUFFER2, C =緩衝區3?
不!您必須檢查'Stream.Read'的返回值以查看實際獲得的字節數。 TCP是*命令的*(意思是說,你可以保證按照你發送的順序接收字節),但也可以*基於數據流*(意思是不保證字節的分組)。爲了更加明確:TCP沒有消息。如果你想要消息,你必須自己構建它們(以長度爲前綴是最常見的方法)。查閱有關網絡代碼的任何教程,瞭解如何編寫正確的接收循環。 –
我已經實現了這個前綴,我的消息的第一個4B是消息的長度,所以在另一方面,我讀取第一個4B,然後將NumberOfBytesToRead設置爲該數字進行另一次讀取。我只是想確認你可能在第一部分中回答的消息的順序:) –
注意:如果你要求4個字節(它們可以跨包傳輸),那麼即使得到4個字節也不能保證,所以即使讀取長度必須在循環中完成,直到你有4個字節。然後你需要再次循環才能得到完整的信息。解決這個問題可能是網絡編程中最常見的錯誤,特別是迂迴,因爲這種代碼在意外或者測試環境中工作得很好,然後在生產中失敗。 –