在NIO中读取数据

时间:2017-08-08 18:17:13

标签: java nio

我正在尝试使用自定义协议编写自己的NIO服务器。像往常一样,我把字节数放在实际字节之前。像这样:

                   509234
Number of bytes----^|||||----Actual bytes

问题在于我提取SelectionKey并得到SocketChannel这样的内容:

SocketChannel channel = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(128);
int numRead = channel.read(buffer); // <---- 4, not 5

我可能会收到字节数:5和实际字节0923,其中最后一个字节4尚不可用于从通道读取。但是对于处理,我需要 所有 字节。

如何应对这种情况?我是否需要将SocketChannel存储在某处(例如Map<SocketChannel, byte[]>)以跟踪它?当剩下的数据可以从频道中读取时,我会将数据添加到Map

1 个答案:

答案 0 :(得分:1)

每个频道需要ByteBuffer。如果它是可读的,请阅读它,当你在那里有完整的信息时,处理它。

您可以通过Map将缓冲区与频道相关联,但使用密钥附加功能更加简单。