JAVA:处理套接字断开 两台计算机通过插座连接。如果服务器/客户端关闭连接 从它们的末端(即关闭InputStream、OutputStream和Socket)开始,我如何通知 关于断开连接的另一端?我知道有一种方法——尝试从InputStream读取, 如果连接关闭,它会抛出一个IOException,但是否有其他方法来检测 另一个问题,我在互联网上查找这个问题,看到了inputStream.available() 这并不能解决这个问题。为什么呢

JAVA:处理套接字断开 两台计算机通过插座连接。如果服务器/客户端关闭连接 从它们的末端(即关闭InputStream、OutputStream和Socket)开始,我如何通知 关于断开连接的另一端?我知道有一种方法——尝试从InputStream读取, 如果连接关闭,它会抛出一个IOException,但是否有其他方法来检测 另一个问题,我在互联网上查找这个问题,看到了inputStream.available() 这并不能解决这个问题。为什么呢,java,sockets,stream,inputstream,outputstream,Java,Sockets,Stream,Inputstream,Outputstream,其他信息:我在寻求另一种方法,因为如果我必须阅读文章,我的项目将变得难以处理 InputStrem检测断开连接。问题不是“如果服务器/客户端关闭连接”。问题是“如果他们不关闭连接,但连接断了怎么办?” 如果没有自己的心跳协议,就无法检测到这种情况 另一个选项是将SO_KEEPALIVE设置为true “如果为TCP套接字设置了keepalive选项,并且在两个小时内没有在套接字的任何方向上交换数据(注意:实际值取决于实现)” 根据我的经验,这比每两个小时要快得多。大约5分钟。除了使用So_KEE

其他信息:我在寻求另一种方法,因为如果我必须阅读文章,我的项目将变得难以处理
InputStrem
检测断开连接。

问题不是“如果服务器/客户端关闭连接”。问题是“如果他们不关闭连接,但连接断了怎么办?”

如果没有自己的心跳协议,就无法检测到这种情况

另一个选项是将SO_KEEPALIVE设置为true

“如果为TCP套接字设置了keepalive选项,并且在两个小时内没有在套接字的任何方向上交换数据(注意:实际值取决于实现)”

根据我的经验,这比每两个小时要快得多。大约5分钟。除了使用So_KEEPALIVE,你真是完蛋了:P

在我的通信协议中,我使用每2秒发送一次的保留“心跳”字节。我自己的filterInputStream和filterOutputStream发送/并消化心跳字节。

问题不是“如果服务器/客户端关闭连接”。问题是“如果他们不关闭连接,但连接断了怎么办?”

如果没有自己的心跳协议,就无法检测到这种情况

另一个选项是将SO_KEEPALIVE设置为true

“如果为TCP套接字设置了keepalive选项,并且在两个小时内没有在套接字的任何方向上交换数据(注意:实际值取决于实现)”

根据我的经验,这比每两个小时要快得多。大约5分钟。除了使用So_KEEPALIVE,你真是完蛋了:P


在我的通信协议中,我使用每2秒发送一次的保留“心跳”字节。我自己的filterInputStream和filterOutputStream发送/并消化心跳字节。

当连接断开时,没有O-O-O方法获取回调/异常。只有在对套接字流执行显式读/写操作时,才能了解断开的连接


有两种方法可以读取套接字,即。当它们到达时,同步地逐字节读取;或者等待流上所需的可用字节数,然后执行大容量读取。通过调用套接字流上的available()来执行检查,该套接字流提供当前可读取的字节数。在第二种情况下,如果套接字连接因某种原因中断,则无法通知您。在这种情况下,您需要为等待使用超时机制。在第一种情况下,如果执行显式读/写操作,则会出现异常

当连接断开时,没有O-O-O方法可以获取回调/异常。只有在对套接字流执行显式读/写操作时,才能了解断开的连接


有两种方法可以读取套接字,即。当它们到达时,同步地逐字节读取;或者等待流上所需的可用字节数,然后执行大容量读取。通过调用套接字流上的available()来执行检查,该套接字流提供当前可读取的字节数。在第二种情况下,如果套接字连接因某种原因中断,则无法通知您。在这种情况下,您需要为等待使用超时机制。在第一种情况下,如果执行显式读/写操作,则会出现异常

Q1如果您关闭了服务器上的套接字连接,客户端应该立即抛出异常,当然是在下次读取尝试时,反之亦然

来自JavaDocs的问题2

返回可读取字节数的估计值(或 跳过)而不会被下一个 为此输入流调用方法。下一次调用 可能是同一个线程或另一个线程。一次读取或跳过 这许多字节不会阻塞,但可以读取或跳过更少的字节


这并不是表示流中当前的字节数,而是从实现中读取的字节数的估计值,该实现不会阻止当前线程。如果您关闭服务器上的套接字连接,客户端应该立即抛出异常,当然是在下次读取尝试时,反之亦然

来自JavaDocs的问题2

返回可读取字节数的估计值(或 跳过)而不会被下一个 为此输入流调用方法。下一次调用 可能是同一个线程或另一个线程。一次读取或跳过 这许多字节不会阻塞,但可以读取或跳过更少的字节

这不是指示流中当前的字节数,而是估计可以从不会阻塞当前线程的实现中读取的字节数

正在尝试从InputStream读取,这会引发IOException

这是不对的。如果对等方关闭套接字:

  • read()
    返回-1
  • readLine()
    返回null
  • readXXX()
    为任何其他X抛出
    EOFEException
由于
InputStream
只有
read()
方法,因此它只返回-1:它不会抛出
ioexe