读取未知长度的数据

本文关键字:数据 未知 读取 | 更新日期: 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的答案。没有比这更好的了