Java NIO:如果读取返回-1,是否意味着客户端已关闭连接



我有一个关于本教程的问题

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

在服务器的 read 方法中,如果 read 返回 -1,那么它是否总是意味着客户端已关闭连接?

发送消息后,我将示例客户端修改为长时间休眠,我看到 selector.select() 不会阻止并继续选择通道为可读通道,即使客户端不发送任何内容并且服务器读取方法读取并返回 -1,从而关闭通道,但客户端没有断开连接。

我不理解这种行为。有人能帮我理解吗?

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

谢谢!

API 应按所述工作。当套接字连接关闭时,读取将返回 -1。这与"消息结束"不同。连接可以通过超时关闭,我注意到您说您让客户端等待了"很长时间"。

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

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

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

在服务器的读取方法中,如果 读取返回 -1 然后始终这样做 表示客户端已关闭连接?

是的。总是。

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

是的,它有。就是这个意思。客户端已关闭连接。

我猜 - 但我不太确定,因为我没有完全阅读它 - 您在端口连接和套接字连接之间的区别中失败了。据我了解,连接是通过特定端口上的套接字打开的。套接字可以在收到发送的消息末尾时关闭 - 但连接仍然可以保留。

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

相关内容

最新更新