java nio:如果read返回-1是否表示客户端已关闭连接?

时间:2011-05-22 21:35:38

标签: java nio

我有一个参考本教程的问题

http://rox-xmlrpc.sourceforge.net/niotut/

在服务器的read方法中,如果read返回-1则表示客户端已关闭连接?

我发送消息后修改了示例客户端长时间休眠我看到selector.select()没有阻塞,并且即使客户端没有发送任何内容而且服务器读取方法读取和返回,仍然选择通道可读-1,因此关闭了频道,但客户端没有断开连接。

我不明白这种行为。有人可以帮助我理解吗?

我正在尝试修改服务器,以便即使客户端没有发送任何内容,服务器也不会与客户端断开连接,因此它必须在selector.select()处阻塞。

谢谢你!

3 个答案:

答案 0 :(得分:3)

API应按照描述工作。当套接字连接关闭时,Read将返回-1。这与“消息结束”不同。一个连接可以通过超时关闭,我注意到你说你让客户等待“很长一段时间”。

我还注意到您正在使用特定教程。该教程中的客户端代码在收到响应后专门关闭连接,并为每次发送打开一个新连接。您必须对客户端代码设计进行大量更改才能阻止此操作。

当我使用不关闭连接的客户端从该教程运行nio服务器时,行为与API描述的一样 - 服务器线程在Selector.select()中等待,而客户端在发送消息之间休眠。

因此,我的回答是您可能正在使用正在关闭连接的客户端,如果不是您正在等待的“长时间”可能会导致网络为您关闭连接。鉴于你描述的行为,我很确定它是前者。

答案 1 :(得分:0)

  

在服务器的read方法中   read返回-1然后始终执行   意味着客户已关闭连接?

是。总是

  

服务器读取方法读取并返回-1,从而关闭通道,但客户端没有断开连接。

是的。这就是它的含义。客户已关闭连接。

答案 2 :(得分:0)

我猜 - 但我不确定,因为我没有完全阅读 - 你在端口连接和套接字连接之间的区别失败了。据我所知,通过特定端口上的套接字打开连接。套接字可以关闭。收到已发送的邮件的结尾 - 但连接仍然可以保留。

据我所知,-1表示通过套接字连接发送的消息的结束。没有明确的指示器直接告诉您连接已关闭....您必须自己发明它。 (我理解的两点。)