SocketChannel - 读取几个数据包的消息

时间:2014-06-01 03:08:50

标签: java selector nio socketchannel

我构建了一个客户端(SocketChannel),它正在收到大消息(每条消息的大小约为1MB~~2MB)。 我怎样才能收到消息? 我正在使用选择器。当密钥isReadable时,我想读取接收消息的所有数据包。 我怎么知道接收数据包属于一条消息而不属于另一条消息?

1 个答案:

答案 0 :(得分:1)

最安全的方法是事先知道每条消息的大小。如果您可以更改服务器协议以在消息本身之前发送消息的大小,那么您在客户端中所要做的就是首先读取大小,最后在ByteBuffer中为该大小分配足够的内存,然后读取数据,直到获得所需的字节数。

如果您无法更改服务器协议,则必须有某种方法来识别消息的开头或结尾,例如特定的页眉或页脚。然后,您需要继续读取数据,直到您到达页脚或下一个标题,具体取决于您拥有的内容。

另请注意,对于大型邮件,您可能不会在单个read()中拥有所有数据。您需要让您的选择键对OP_READ操作感兴趣,每次read()都会在缓冲区中添加一块数据,直到从通道读取所有数据。