我在这里遇到了一个难题......
我的客户端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?
答案 0 :(得分:2)
Socket.getLocalAddress()
将返回全零,或者从不绑定或连接它。Socket.isClosed()
告诉您是否已关闭套接字。Socket.isConnected()
告诉您是否连接了套接字。测试 peer 是否已关闭连接:
read()
返回-1 readLine()
返回null readObject(), readInt(), readXXX()
对于任何其他XXX,抛出EOFException.