Java 如何连接和关闭插座?
我正在使用Java套接字客户端。如果服务器仍然连接到我的客户机,但它没有发送对我的消息的响应,我最终会收到一个读取超时异常 在这种情况下,我想测试一下,看看我是否应该重新连接我的套接字,或者只是保持它的重复使用 我使用这个条件:Java 如何连接和关闭插座?,java,sockets,Java,Sockets,我正在使用Java套接字客户端。如果服务器仍然连接到我的客户机,但它没有发送对我的消息的响应,我最终会收到一个读取超时异常 在这种情况下,我想测试一下,看看我是否应该重新连接我的套接字,或者只是保持它的重复使用 我使用这个条件: if (!socket.isConnected() || socket.isClosed() || !socket.isBound()) { try { socket.close(); } catch (IOException e1) {
if (!socket.isConnected() || socket.isClosed() || !socket.isBound()) {
try {
socket.close();
} catch (IOException e1) {
}
// Wait on a new connection
socket = connectSocket(.....);
}
但我似乎总是重新连接。当我记录布尔属性的值时,我看到:
已连接:真关闭:真绑定:真
如何连接和关闭它
TIA就这个话题进行了一些有益的讨论。如果它(曾经)成功连接,则返回true
从上面的线程:
当您使用您似乎忽略的Socket()
时,
Socket.isConnected()
告诉您是否调用了Socket.connect()
或者不是。类似地,对于isClosed()
和close()
对这些方法的混淆是由于混淆了
受应用程序控制的套接字,状态为
在协议控制下的整个连接的。
isConnected()
和isClosed()
告诉您对套接字做了什么。
除了读写之外,没有其他API可用于确定
连接
文件说:
如果套接字成功连接到服务器,则返回true
而不像人们所期望的“如果套接字连接到服务器,则返回true”
可以通过查看套接字的源来确认该行为:
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
我必须说,文档在这一点上非常不清楚,方法名称有点误导。方法调用不是原子的。。。也许另一个线程正在关闭
isConnected()
和isClosed()调用之间的套接字?也许先在socket对象上同步?如果您只需颠倒检查isConnected()
和isClosed()
的顺序,这很容易测试。断开的链接,但从引文来看,它似乎是从这里或Sun/Oracle Java论坛的答案中取消的holus bolus,其中许多是我做的。回答不错。我也对断开连接感到困惑。