【问题标题】:Java nio Reading SocketChannel on a SelectorJava nio 在选择器上读取 SocketChannel
【发布时间】:2012-07-18 10:32:59
【问题描述】:

我有一个小型服务器应用程序,它接收来自多个客户端的连接。 客户端将连接,发送消息并断开连接,没有返回响应。

我正在使用 ServerSocketChannel 来监听连接。 我使用选择器收到新连接的通知,发生这种情况时,我将 SocketChannel 注册到 SelectionKey.OP_READ 的选择器中

我不确定的部分是我何时收到通知数据可供阅读。 我的 SocketChannels 处于非阻塞模式。 我在 SocketChannel 上调用 channel.read(buffer) 来读入字节缓冲区 从要读取的 javadoc 中,我应该重复调用它,直到我得到一个 -1 表示流结束。但是,我不确定在再次调用 read 之前是否应该等待选择器再次通知我。 那就是:

  • 选择器通知我数据可用。
  • 我叫读
  • 我应该再次调用 read 直到返回 -1 还是让选择器通知我然后再次调用 read

非常感谢

【问题讨论】:

    标签: java nio socketchannel


    【解决方案1】:

    从 javadoc 中读取,我应该重复调用它,直到我得到一个 -1 表示流结束。

    它没有说任何这样的事情。

    如果您处于非阻塞模式,则可以读取直到它返回 -1 或零。如果它返回零,则说明套接字接收缓冲区中没有待处理的数据,因此您应该返回到选择循环。如果它返回-1,就这样,完成,完成,finito,关闭套接字通道并继续进行。

    【讨论】:

    • 谢谢,是的,javadoc 没有这么说,但是网上的一些教程可以。你写的很有意义。
    • @jasg 网上大部分教程都是垃圾,尤其是 NIO 的。坚持甲骨文网站上的那些。它们并不完美,但至少它们已经过 QA 和审查;它们来自正确的来源;他们有一个错误报告系统。 IBM 的通常也是一流的。避免使用博客、面试问题网站以及任何未经审查和未经审查的东西,例如瘟疫。
    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    相关资源
    最近更新 更多