DataReader - 读取长度未知的数据

Posted

技术标签:

【中文标题】DataReader - 读取长度未知的数据【英文标题】:DataReader - read data with unknown length 【发布时间】:2014-05-28 14:25:08 【问题描述】:

我已经与 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# 中有一个同样简单的解决方案....

【问题讨论】:

【参考方案1】:

如果你需要一个集合来存储未知长度的数据,你应该使用像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();

【讨论】:

【参考方案2】:

您发布的 Java 代码在 C# 中绝对有一个简单的等价物。实际上,您当前正在使用的 C# 版本使用异步调用,这比对流的简单调用要复杂得多。如果您想在没有异步调用的情况下在 C# 中使用缓冲流,您可以在流上使用 Read。很简单:

socket.InputStream.Read()

在您的 java 代码中,您似乎正在使用大小为 100 的缓冲区来读取流。您只读取了 100 个字节的流,而不是一直读取到最后。如果这是您想要的,您可以这样做:

byte[] b = new byte[100];
int readTo = socket.InputStream.Read(b, 0, 100);

另外,如果您想一直走到最后,请使用 Jon Skeet 的回答 here。没有比这更好的了。

【讨论】:

WP8.1 中只有 ReadAsync 方法,我已经尝试使用 b.AsBuffer() 方法,因为 ReadAsync 需要一个 IBuffer 对象,它比我自己的解决方案效果更好。谢谢

以上是关于DataReader - 读取长度未知的数据的主要内容,如果未能解决你的问题,请参考以下文章

无法在Fortran中读取未知长度字符串的实数

从文件中读取未知长度的 int 数组

如何使用 datareader 从数据表中读取

如何读取长度未知的输入字符串?

如何使用相同的代码从 DataRow 或 DataReader 中读取数据?

C 套接字服务器:读取所有未知长度 XMLHttpRequest 的正确方法是啥?