读取未知长度的数据
本文关键字:数据 未知 读取 | 更新日期: 2023-09-27 18:05:29
我已经与Tomcat java服务器建立了连接。
发送登录数据后,服务器响应。响应的长度未知。
所以我试图使用DataReader读取字节后的字节。UnconsumedBufferLength
DataReader din = new DataReader(socket.InputStream);
int i = 0;
byte[] b = new byte[64];
await din.LoadAsync(1);
while(din.UnconsumedBufferLength > 0)
{
din.LoadAsync(1);
b[i] = din.ReadByte();
await din.LoadAsync(1)
i++;
}
这种解决方案的工作,我得到的消息到字节数组,但它远非理想的。相应的Java客户机使用这一小行代码
BufferedInputStream inFromServer = new BufferedInputStream(socket.getInputStream());
int read = 0;
byte[] result = new byte[100];
read = inFromServer.read(result);
我希望c#中也有一个同样简单的解决方案....
如果你需要一个集合来存储未知长度的数据,你应该使用通用的集合,如List
:
DataReader din = new DataReader(socket.InputStream);
List<byte> _ByteList = new List<byte>();
await din.LoadAsync(1);
while(din.UnconsumedBufferLength > 0)
{
din.LoadAsync(1);
_ByteList.Add(din.ReadByte());
await din.LoadAsync(1)
}
然后,如果需要一个数组,使用
byte [] _ByteArray = _ByteList.ToArray();
在c#中绝对有一个与你发布的java代码相当的简单方法。实际上,你目前正在使用的c#版本使用异步调用,这比简单地调用流要复杂得多。如果你想在c#中使用没有异步调用的缓冲流,你可以在流上使用Read
。就像:
socket.InputStream.Read()
在你的java代码中,似乎你正在使用大小为100的缓冲区来读取流。您只读取流的100个字节,而不是一直读取到流的末尾。如果这是你想要的,你可以这样做:
byte[] b = new byte[100];
int readTo = socket.InputStream.Read(b, 0, 100);
另外,如果你想一直问到最后,请使用Jon Skeet的答案。没有比这更好的了