我正在尝试使用自定义协议编写自己的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
答案 0 :(得分:1)
每个频道需要ByteBuffer
。如果它是可读的,请阅读它,当你在那里有完整的信息时,处理它。
您可以通过Map
将缓冲区与频道相关联,但使用密钥附加功能更加简单。