我正在使用Java套接字客户端。如果服务器仍然连接到我的客户端但它没有发送响应我的消息 - 我最终得到一个读取超时异常。
在这种情况下,我想测试一下,看看我是否应该重新连接我的套接字,或者只是让它重复使用它。
我使用这个条件:
if (!socket.isConnected() || socket.isClosed() || !socket.isBound()) {
try {
socket.close();
} catch (IOException e1) {
}
// Wait on a new connection
socket = connectSocket(.....);
}
但我似乎总是重新联系。当我记录布尔属性的值时,我看到:
connected:true closed:true bound:true
如何连接和关闭?
TIA
答案 0 :(得分:70)
This thread就此主题进行了一些有用的讨论。事实证明,Socket.isConnected
如果已成功连接,则返回true。
从以上主题:
当您使用
Socket()
时,您似乎忽视了这一点,Socket.isConnected()
告诉您是否已调用Socket.connect()
或不。同样适用于isClosed()
和close()
。对这些方法的混淆是由于混淆了状态 socket ,由应用程序控制,具有状态 整个连接,它在协议的控制之下。
isConnected()
和isClosed()
告诉你对套接字做了什么。 除了读取和写入之外,没有用于确定状态的API 连接。
文档说:
如果套接字成功连接到服务器
,则返回true
并不像人们所期望的那样“如果套接字连接到服务器,则返回true”。
通过查看Socket的来源可以确认行为:
public boolean isConnected() {
// Before 1.3 Sockets were always connected during creation
return connected || oldImpl;
}
你也可以运行这个小测试片段:
Socket s = new Socket();
System.out.println("isConnected: " + s.isConnected() +
" isBound: " + s.isBound() +
" isClosed: " + s.isClosed());
s.connect(new InetSocketAddress("google.com", 80));
System.out.println("isConnected: " + s.isConnected() +
" isBound: " + s.isBound() +
" isClosed: " + s.isClosed());
s.close();
System.out.println("isConnected: " + s.isConnected() +
" isBound: " + s.isBound() +
" isClosed: " + s.isClosed());
打印哪些:
isConnected: false isBound: false isClosed: false
isConnected: true isBound: true isClosed: false
isConnected: true isBound: true isClosed: true
我必须说文档在这一点上还不太清楚,而且方法名称有点误导。