Java nio读取选择器上的SocketChannel

时间:2012-07-18 10:33:00

标签: java nio socketchannel

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

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

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

  • 选择通知我数据可用。
  • 我打电话给读
  • 我是否应该再次调用read直到返回-1,或者我应该让选择器通知我再调用read

非常感谢

1 个答案:

答案 0 :(得分:3)

  

从javadoc for read,我应该重复调用它,直到我得到-1表示流的结束。

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

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