1

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

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

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

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

非常感谢

4

1 回答 1

3

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

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

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

于 2012-07-18T10:39:20.857 回答