【问题标题】:SocketChannel - read message of several packetsSocketChannel - 读取多个数据包的消息
【发布时间】:2014-06-01 03:08:50
【问题描述】:

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

【问题讨论】:

    标签: java selector nio socketchannel


    【解决方案1】:

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

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

    还请记住,对于大型消息,您可能不会在单个 read() 中获得所有数据。您需要保持您的选择键对 OP_READ 操作感兴趣,每次 read() 都将一大块数据添加到缓冲区中,直到从通道中读取所有数据。

    【讨论】:

    • 嗨,谢谢。你是对的,我正在大块地获得messafe。但我不知道如何编写代码来读取几个块并将其构建为一个缓冲区?
    • 你不会指望我为你写代码吧?现在你有一个清晰的问题陈述可以用于你的设计,你可以在谷歌上搜索这个主题,你会找到许多可以帮助你入门的示例和教程。归根结底,如果你真的想精通 NIO,就看你自己去实现它了,这包括犯错误、改正错误并从中学习。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 2018-08-22
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多