Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaNIO:若read返回-1,是否意味着客户端已关闭连接?_Java_Nio - Fatal编程技术网

JavaNIO:若read返回-1,是否意味着客户端已关闭连接?

JavaNIO:若read返回-1,是否意味着客户端已关闭连接?,java,nio,Java,Nio,关于本教程,我有一个问题 在服务器的read方法中,如果read返回-1,那么它是否总是意味着客户端已关闭连接 在发送消息后,我将示例客户端修改为长时间睡眠。我看到selector.select()不会阻止并保持选择通道为可读,即使客户端不发送任何内容,服务器读取方法读取并返回-1,从而关闭通道,但客户端未断开连接 我不理解这种行为。有人能帮我理解吗 我正在尝试修改服务器,以便即使客户端未发送任何内容,服务器也不会与客户端断开连接,因此它必须在选择器处阻塞。select() 谢谢大家! 在服务

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

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

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

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

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

谢谢大家!

在服务器的read方法中,如果 读取返回值-1,那么它是否总是 你的意思是说客户端已经关闭了连接

对。总是

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


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

我猜-但我不是很确定,因为我没有完全阅读它-您无法区分端口连接和套接字连接。据我所知,连接是通过特定端口上的套接字打开的。插座可以分别关闭。已收到发送的消息的结尾-但连接仍可以保持


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

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

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

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


因此,我的答案是,您可能正在使用一个正在关闭连接的客户端,如果您等待的时间不长,可能会导致网络为您关闭连接。考虑到你所描述的行为,我敢肯定是前者。

这个答案毫无意义。没有端口连接和套接字连接相反。只有连接。如果对等方关闭了连接,则得到-1。如果你自己关上它,你会得到一个SocketClosedException。没有第三种可能性。您不能关闭端口或连接,只能关闭作为连接端点的套接字。您可以在端口3500上建立连接。服务器可以在端口3500上进行3个插座连接。如果三个套接字连接中的一个关闭,则一个关闭,即a-1,但另两个连接保持打开(在端口3500上)。[编辑不可能,因此其余]您EJP所写的内容仅在一个套接字到端口连接,而不是一个端口上的多个套接字连接时有效。因此,接收-1并不一定意味着“客户端与服务器断开连接”,而是意味着“来自一个客户端的一个套接字连接已关闭”。i、 e-1可能仍然意味着另一种联系依然生动。@LeO:你的术语太不准确了,很难准确地说出你在说什么。(1) 没有所谓的“套接字连接”或“通过一个端口”。有(i)端口,(ii)连接和(iii)插座。(2) 如果对等方关闭连接,您将在其上读取-1。如果在连接上读取-1,则对等方已将其关闭。(3) 在您现在描述的情况下,短语“客户端已断开与服务器的连接”没有任何意义。我没有用它。是的。在这种情况下,您读取-1的连接已关闭,其他连接仍保持打开状态。@Leo您说过“套接字可以分别关闭。”。已收到发送的消息的结尾,但连接仍然可以保持。这完全是不真实的。那个连接是关闭的。时期其他连接可能存在也可能不存在,读取它们可能返回也可能不返回-1。这是不可逆转的。通过大量连接“客户端与服务器断开连接”的概念仍然没有任何实际意义。我的反对票关系到你答案的准确性,而不是你的意图。这就是它的工作原理,我喜欢这个。两张未经解释的否决票,也被标记为正确,事实就是如此。