此线程有一些关于此主题的有用讨论。事实证明,Socket.isConnected
如果已成功连接(曾经)返回 true。
从上面的线程:
当你使用时,你似乎忽略了,告诉你是否被调用了。与 类似地,对于 和 。Socket()
Socket.isConnected()
Socket.connect()
isClosed()
close()
混淆这些方法会导致套接字的状态(由应用程序控制)与整体连接的状态(受协议控制)混淆。 并告诉您对插座做了什么。除了用于确定连接状态的读取和写入之外,没有其他 API。isConnected()
isClosed()
文档说:
如果套接字成功连接到服务器,则返回 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
我必须说,文档在这一点上非常不清楚,并且方法名称有点误导。