2010-08-19 70 views
0

在我的程序中我創建套接字和whes客戶端連接我創建新線程並嘗試讀取和寫入/連接到此套接字,但一直得到一個讀取錯誤,因爲主機關閉第二個命令的連接,第一個來自客戶端worfs的命令正常,第三個可以正常工作。我嘗試檢查clientSocket是否連接,以及networkStream是否可讀,並且它們一直返回true。我該如何解決這個問題?它怎麼可能 - networkStream.CanRead返回true,但networkStreamRead引發錯誤?我是C#和套接字編程的新手,所以對於愚蠢的問題感到抱歉。C#套接字讀取錯誤

clientSocketTcpClient
networkStreamNetworkStream

if (clientSocket.Connected == true) 
{ 
    requestCount = requestCount + 1; 
    networkStream = clientSocket.GetStream(); 
    if (networkStream.CanRead == true) 
    { 
     networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); 
     dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); 
    } 

} 
+0

clientSocket.ReceiveBufferSize的值是什麼? bytesFrom足夠大以接受這麼多字節? – 2010-08-19 03:25:14

+0

>> networkStream.CanRead返回true,但networkStreamRead引發錯誤? 請給出錯誤的詳細信息。 – Dagang 2010-08-19 04:00:51

回答

3

NetworkStream.CanRead屬性僅指示流支持閱讀,並不意味着在所有的數據是可用的。從網絡讀取時,您必須始終讀取,直到整個幀完成,幀的含義完全取決於協議:它可能意味着前導碼大小頭,終止符(如\ 0x0A)或特殊序列(如單個點)在一條線上。雖然幀不完整,但您必須不斷髮布接收緩衝區,或者如果使用流式API讀取流。

第二個問題是,你顯然不得不限制你解釋只接收你收到的字節,而不是整個發佈的緩衝區。 NetworkStream.Read返回接收到的可用的字節的實際數量,到目前爲止,之後在緩衝任何事情都是垃圾:

networkStream = clientSocket.GetStream(); 
int bytesReceived = networkStream.Read(
    bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); 
dataFromClient = System.Text.Encoding.ASCII.GetString(
    bytesFrom, 0, bytesReceived); 

這仍然不能正確處理框架分隔符,因爲你不知道,如果是dataFromClient所有來自客戶端的數據,但這完全取決於協議。

+0

+1對於基本的網絡編程非常好的解釋。 – Emiswelt 2010-08-19 13:08:22