2012-03-13 6 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

メッセージ全体を読むまで、ストリームを呼び出します。事前にメッセージサイズを知っている場合、それは比較的簡単です:

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'がメッセージに含まれているときにメッセージが終了したことを知ります。 –

+0

これはテキストメッセージに適しています。バイナリメッセージは扱いにくいです。 – zmbq

+0

あなたは正しいですが、彼のコードでは、受け取った結果を文字列に変換しているので、バイナリメッセージを送信しているのではないかと思います。おかげさまで –

関連する問題