假设我已经实现了一个简单的TCP协议,其中每条消息由以下内容组成:
使用
有没有一种简单的方法来做到这一点,而不必循环读取,重启偏移量等待剩余数据?
在真实的应用程序中,读取可能应该异步完成或在后台线程上完成,但我现在暂时忽略了这个问题。重要的是能够使读取在所有数据可用之前不完成。
编辑
我知道我可以自己缓冲数据,并且我知道如何做到这一点。它只是一个循环,围绕
- 表示数据长度的
int
。 - 二进制数据,长度由1指定。
int length = input.ReadInt();
byte[] data = input.ReadBytes(length);
使用
Socket.Receive
或NetworkStream.Read
读取可用的字节数。我希望调用ReadBytes
的时候能够阻塞,直到有length
个字节可用。有没有一种简单的方法来做到这一点,而不必循环读取,重启偏移量等待剩余数据?
在真实的应用程序中,读取可能应该异步完成或在后台线程上完成,但我现在暂时忽略了这个问题。重要的是能够使读取在所有数据可用之前不完成。
编辑
我知道我可以自己缓冲数据,并且我知道如何做到这一点。它只是一个循环,围绕
Receive
继续下一个偏移量。我要问的是,是否有可重复使用的这样的循环实现,无需任何自己的循环(或者另外一种可重复使用的异步实现,在所有数据可用时完成)。
BinaryReader.Read
文档说明它返回读取的字节数,并且如果没有那么多可用的字节,则可能少于请求的字节数。我猜我必须测试这意味着“现在可用的字节”还是“套接字关闭之前接收到的字节”。 - Anders Abel