我有一个小型服务器应用程序,它接收来自多个客户端的连接。 客户端将连接,发送消息并断开连接,没有回复响应。
我正在使用ServerSocketChannel来侦听连接。
我收到使用选择器的新连接的通知,当发生这种情况时,我使用SelectionKey.OP_READ
的选择器注册SocketChannel
我不确定的部分是当我收到通知数据可供阅读时。
我的SocketChannel处于非阻塞模式。
我在SocketChannel上调用channel.read(buffer)
来读入字节缓冲区
从javadoc中读取,我应该重复调用它,直到我得到-1表示流的结束。但是,我不确定在再次调用read之前是否应该等待选择器再次通知我。
那就是:
非常感谢
答案 0 :(得分:3)
从javadoc for read,我应该重复调用它,直到我得到-1表示流的结束。
它没有说任何这样的事情。
如果您处于非阻塞模式,则可以读取直到它返回-1 或零。如果它返回零,则套接字接收缓冲区中没有更多数据待处理,因此您应该返回到选择循环。如果它返回-1,那就是它,完成,完成,完成,关闭套接字通道并相应地继续。