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

时间:2013-11-25 08:07:33

标签: java sockets ssl disconnected-session

我在这里遇到了一个难题......

我的客户端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?

1 个答案:

答案 0 :(得分:2)

    如果您关闭套接字,
  • Socket.getLocalAddress()将返回全零,或者从不绑定或连接它。
  • Socket.isClosed()告诉您是否已关闭套接字。
  • Socket.isConnected()告诉您是否连接了套接字。

测试 peer 是否已关闭连接:

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