当我事先不知道会有多少数据进入时,如何从流中读取?现在我只选了一个偏高的数字(如下面的代码所示),但不能保证我不会得到更多。
所以我在循环中一次读取一个字节,每次调整数组大小?听起来像是要做太大的调整: - /
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();
答案 0 :(得分:6)
MemoryStream是你的朋友
http://msdn.microsoft.com/en-us/library/system.io.memorystream
构造没有默认大小,它将自动调整大小。然后循环,因为你建议每次读取合理数量的数据。我通常选择MTU作为默认缓冲区大小。
获取它创建的底层byte []数组调用
memoryStreamInstance.GetBuffer()
答案 1 :(得分: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
中找到的字节的长度,如果它已到达结尾。
答案 2 :(得分:3)
您是否尝试过StreamReader类?我不确定它是否适用于这种情况,但我过去曾使用StreamReader读取HttpWebResponse响应流。非常容易使用。
StreamReader reader = new StreamReader(stm);
String result = reader.ReadToEnd();
答案 3 :(得分:1)
int count;
while ( (count = stm.Read(buffer, 0, buffer.Length)) > 0 ) {
// process buffer[0..count-1]
// sample:
// memoryStream.Write(buffer, 0, count);
}
答案 4 :(得分:0)
代码:
byte[] buffer = new byte[1024];
int amt = 0;
while((amt = stm.Read(buffer, 0, 1024) != 0)
{
// do something
}
取决于你接收的内容,只是纯文本你可以将它存储在stringbuilder中,如果有大量的二进制数据,将它存储在sanya memorystream中
答案 5 :(得分:0)
我想这取决于您要对数据做什么?
如果你不需要一次只能在循环中执行读操作?