2015-02-23 72 views
1


我正在寫tcp套接字程序。
當我發送字符串,比以前發送,從客戶端收到並在服務器上接收它,發生了一些奇怪的事情。例如:
首先我發送'999999999'。服務器收到良好。
之後,我發送較短的字符串:'7777777'。但服務器上的數據是'777777799'TCP套接字編程,讀數據時奇怪的行爲

爲什麼之前的數據剩餘量在下次發送時仍然存在?

我的代碼如下:

// Section: client sending data ---- 
NetworkStream serverStream = clientSocket.GetStream(); 
byte[] outStream = Encoding.ASCII.GetBytes("999999999"); 
serverStream.Write(outStream, 0, outStream.Length); 
serverStream.Flush(); 

// Section: Server reading data ---- 
while ((true)) 
{ 
    NetworkStream networkStream = clientSocket.GetStream(); 
    networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); 
    dataFromClient = Encoding.ASCII.GetString(bytesFrom); 
    networkStream.Flush(); 
} 
+0

你是否在第二次讀取之前清除bytesFrom?我懷疑你的緩衝區bytesFrom裏面有舊數據! – Adil 2015-02-23 09:52:51

+0

您確定服務器在第一次閱讀時看到完整的「999999999」嗎? – 2015-02-23 09:53:59

回答

1

你忽略的數據量你讀過,而不是總是整個字節數組轉換成一個字符串,其中包括仍然存在的任何數據先前的讀取(或初始字節數組元素)。你應該有:

int bytesRead = networkStream.Read(bytesFrom, 0, bytesFrom.Length); 
dataFromClient = Encoding.ASCII.GetString(bytesFrom. 0, bytesRead); 

請注意,我已經改變了第三個參數networkStream.Read,太 - 否則,如果有更多的數據比你有空間數組中,你會得到一個異常。 (如果你真的想使用ReceiveBufferSize,那麼創建該陣列的長度。)

此外,你應該檢查bytesRead是積極的 - 否則,如果連接關閉,你會得到一個異常。

基本上,你應該差不多從來沒有忽略Stream.Read的返回值。