2009-05-07 24 views
1

データがどのくらい入ってくるかわからないときに、ストリームから読み込むにはどうすればよいですか?今、私はちょうどハイサイドで(以下のコードのように)数字を選んだが、それ以上は得られないという保証はない。ストリームからストリームを読み込み[C#]

私はループで一度に1バイトずつ読み込み、毎回配列のサイズを変更しますか?あまり行われなければリサイズような音: -/

TcpClient tcpclnt = new TcpClient(); 
tcpclnt.Connect(ip, port); 

Stream stm = tcpclnt.GetStream(); 

stm.Write(cmdBuffer, 0, cmdBuffer.Length); 

byte[] response = new Byte[2048]; 
int read = stm.Read(response, 0, 2048); 

tcpclnt.Close(); 

答えて

3

あなたはデータの(メモリに収まりきら)膨大な量を取得していないと仮定すると、それをすべて一緒に置く:

TcpClient tcpclnt = new TcpClient(); 
tcpclnt.Connect(ip, port); 
Stream stm = tcpclnt.GetStream(); 
stm.Write(cmdBuffer, 0, cmdBuffer.Length); 
MemoryStream ms = new MemoryStream(); 
byte[] buffer = new Byte[2048]; 
int length; 
while ((length = stm.Read(buffer, 0, buffer.Length)) > 0) 
    ms.Write(buffer, 0, length); 
tcpclnt.Close(); 
byte[] response = ms.ToArray(); 

としてはMemoryStreamはあなたのための動的なバイト配列の割り当てを処理します言及しました。 Stream.Read(byte[], int, int)は、この「読み取り」に見つかったバイトの長さを返します。最後に達した場合は0になります。

+0

ありがとう!私がレスポンスを読む前に、配列のサイズ変更、バッファのコピーなどでこのようなことがありました。ほんの数行しかありませんが、これははるかに優れています – flamey

1
int count; 
while ((count = stm.Read(buffer, 0, buffer.Length)) > 0) { 
    // process buffer[0..count-1] 
    // sample: 
    // memoryStream.Write(buffer, 0, count); 
} 
0

コード:

byte[] buffer = new byte[1024]; 
int amt = 0; 
while((amt = stm.Read(buffer, 0, 1024) != 0) 
{ 
    // do something 
} 

だけでプレーンテキストを使用して、StringBuilderの中でそれを保存することができれば、あなたはrecevingしているかについて少し異なり、大量のバイナリデータは、MemoryStreamを言うに保管した場合

+0

hm、私のコードフィールドは失敗しました:) –

+0

修正済み。恥私は15文字未満のコメントを残すことはできません、私はチャー7で必要なすべてを言った。 – GWLlosa

6

のMemoryStreamはあなたの友達です

http://msdn.microsoft.com/en-us/library/system.io.memorystream 

デフォルトサイズを持たずに作成すると自動サイズ変更されます。それでは、毎回妥当な量のデータを読むことをお勧めします。私は通常、デフォルトのバッファサイズとして最低でもMTUを選択します。

それがコール

memoryStreamInstance.GetBuffer() 
0

を作成することを基本となるバイト[]配列を取得するために、私はそれはあなたがデータをどうしようとしているかに依存思いますか?

一度にすべてを必要としない場合は、ループ内で読み取り操作を実行するだけで済みます。

2

StreamReaderクラスを試しましたか?このケースに該当するかどうかはわかりませんが、過去にHttpWebResponse応答ストリームを読み込むためにStreamReaderを使用しました。非常に使いやすい。

StreamReader reader = new StreamReader(stm); 
String result = reader.ReadToEnd(); 
関連する問題