【发布时间】:2014-06-01 03:08:50
【问题描述】:
我构建了一个客户端(SocketChannel),它正在接收大消息(每条消息的大小为~1MB-~2MB)。 我怎样才能得到消息? 我正在使用选择器。当密钥为可读时,我想读取接收消息的所有数据包。 我如何知道接收数据包属于一条消息而不属于另一条消息?
【问题讨论】:
标签: java selector nio socketchannel
我构建了一个客户端(SocketChannel),它正在接收大消息(每条消息的大小为~1MB-~2MB)。 我怎样才能得到消息? 我正在使用选择器。当密钥为可读时,我想读取接收消息的所有数据包。 我如何知道接收数据包属于一条消息而不属于另一条消息?
【问题讨论】:
标签: java selector nio socketchannel
最安全的方法是提前知道每条消息的大小。如果您可以更改服务器协议以在消息本身之前发送消息的大小,那么您在客户端中要做的就是首先读取大小,最终在 ByteBuffer 中为该大小分配足够的内存,然后读取数据,直到获得所需的字节数。
如果您无法更改服务器协议,则必须有某种方法来识别消息的开头或结尾,例如特定的页眉或页脚。然后你需要继续读取数据,直到到达页脚或下一个页眉,这取决于你有什么。
还请记住,对于大型消息,您可能不会在单个 read() 中获得所有数据。您需要保持您的选择键对 OP_READ 操作感兴趣,每次 read() 都将一大块数据添加到缓冲区中,直到从通道中读取所有数据。
【讨论】: