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



我陷入了一个难题…

我的客户端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()告诉您是否连接过插座

要测试对等端是否已关闭连接:

  1. read()返回-1
  2. readLine()返回null
  3. readObject(), readInt(), readXXX()对于任何其他XXX,抛出EOFException.

最新更新