2012-03-13 74 views
0

我有以下代碼:TCPClient。我如何收到大消息?

private string Connect() 
{ 
    string responseData; 

    try 
    { 
     TcpClient client = new TcpClient(ServerIp, Port); 
     client.ReceiveBufferSize = Int32.MaxValue; 

     Byte[] data = Encoding.GetEncoding(1251).GetBytes(ReadyQuery); 


     NetworkStream stream = client.GetStream(); 

     // send data 
     stream.Write(data, 0, data.Length); 


     // buffer 
     data = new Byte[65536];    

     Int32 bytes = stream.Read(data, 0, data.Length); 
     responseData = Encoding.GetEncoding(1251).GetString(data, 0, bytes);     

     // close all 
     stream.Close(); 
     client.Close(); 
     return responseData; 
    } 

我有問題,一個大的消息。接收郵件的大小是22K字符。我只獲得了部分信息。
我怎樣才能收到大消息?

PS。在調試器bytes等於4096

回答

4

您調用stream.Read循環直到讀完整個消息。如果你事先知道消息的大小是相對容易:

int messageSize = 22000; 
int readSoFar = 0; 
byte [] msg = new byte[messageSize]; 

while(readSoFar < messageSize) 
{ 
    var read = stream.Read(msg, readSoFar, msg.Length - readSoFar); 
    readSoFar += read; 
    if(read==0) 
     break; // connection was broken 
} 

如果郵件的大小是消息的一部分(也就是說,今年前4個字節編碼),你應該閱讀的第一,然後做我建議。

+0

作爲補充:如果您事先不知道消息大小,那麼使用一些「消息終止符」總是一個好主意。例如,您可能會在末尾附加一個「ETX」字符,以便客戶端知道當消息中包含「ETX」時,該消息將結束。 – 2012-03-13 09:27:16

+0

這對文本消息很有用。二進制消息更棘手。 – zmbq 2012-03-13 09:28:46

+0

你是對的 - 但在他的代碼中,他將收到的結果轉換爲字符串,所以我懷疑他發送的是二進制消息。 – 2012-03-13 09:55:01