Java客户端SSLSocket:如何判断远程端是否已关闭连接?

Java客户端SSLSocket:如何判断远程端是否已关闭连接?,java,sockets,ssl,disconnected-session,Java,Sockets,Ssl,Disconnected Session,我陷入了一个难题 我的客户端SSLSocket连接到服务器(不是Java),并按预期成功地读取和写入二进制数据。然后,在某个时间点,服务器断开客户机的连接。但是,客户端仍然可以调用startHandshake(),而不会引发异常,并且我看不到连接断开的迹象,除了getLocalSocketAddress()返回所有0的IP 下面是代码的样子: SSLSocket socket = (SSLSocket)socketFactory.createSocket(host, port); socket.

我陷入了一个难题

我的客户端SSLSocket连接到服务器(不是Java),并按预期成功地读取和写入二进制数据。然后,在某个时间点,服务器断开客户机的连接。但是,客户端仍然可以调用
startHandshake()
,而不会引发异常,并且我看不到连接断开的迹象,除了
getLocalSocketAddress()
返回所有0的IP

下面是代码的样子:

SSLSocket socket = (SSLSocket)socketFactory.createSocket(host, port);
socket.setTcpNoDelay(true);
socket.setKeepAlive(true);

/* Socket happily sends/receives data */
socket.getOutputStream().write(myData);
socket.getOutputStream().flush();
socket.getInputStream().read(myBuffer);
// do something with myBuffer

Thread.sleep(20 * 1000);  // During this wait period, server disconnects the client

socket.getLocalSocketAddress();  // returns host:port as expected

socket.startHandshake();  // doing another read/write will also produce the same result

socket.getLocalSocketAddress();  // returns an IP of all zeroes: /0:0:0:0:0:0:1129:6a1f%0:51447
socket.isClosed();  // somehow, returns false!
socket.isConnected();  // somehow, returns true!

socket.getOutputStream.write(myOtherData);  // throws a SocketException: Broken pipe.
基本上,我想我的问题是,除了检查
getLocalSocketAddress()
是否具有所有0的IP之外,是否还有其他方法确定服务器是否断开了连接?

  • Socket.getLocalAddress()
    如果已关闭套接字,或从未绑定或连接过套接字,则返回全零
  • Socket.isClosed()
    告诉您是否已关闭套接字
  • Socket.isConnected()
    告诉您是否连接过该套接字
要测试对等方是否已关闭连接,请执行以下操作:

  • read()
    返回-1
  • readLine()
    返回null
  • readObject()、readInt()、readXXX()
    对于任何其他XXX,抛出
    EOFEException。
  • 令人惊叹的!read()正是我想要的。现在,接下来的问题是…为什么当我在上面启动时,它不会抛出异常?底层SSL或TCP层不应该检测到服务器已经关闭了连接吗?我还可以编写数据,而不会引发异常。谢谢(a) 如果对方没有先完成握手,就无法关闭连接,因此你方的握手总是会成功;(b) 由于缓冲,在发生管道中断异常之前,通常至少可以写入一次。