我正在使用 Java 套接字客户端。如果服务器仍然连接到我的客户端,但它没有发送对我的消息的响应 - 我最终会收到读取超时异常。
在这种情况下,我想测试一下是否应该重新连接我的套接字,或者只是保留它并重新使用它。
我使用这个条件:
if (!socket.isConnected() || socket.isClosed() || !socket.isBound()) {
try {
socket.close();
} catch (IOException e1) {
}
// Wait on a new connection
socket = connectSocket(.....);
}
但我似乎总能重新建立联系。当我记录布尔属性的值时,我看到以下内容:
连接:true 关闭:true 绑定:true
怎么才能连接和关闭呢?
TIA
这个线程 http://www.javakb.com/Uwe/Forum.aspx/java-programmer/7473/Socket-isConnected-isClosed关于这个主题有一些有用的讨论。事实证明Socket.isConnected http://download.oracle.com/javase/1.4.2/docs/api/java/net/Socket.html#isConnected%28%29如果(曾经)成功连接,则返回 true。
从上面的线程:
当你使用Socket()
,你似乎忽略了,Socket.isConnected()
告诉你是否Socket.connect()
已被称为
或不。同样对于isClosed()
and close()
.
对这些方法的混淆是由于混淆了socket,这是在应用程序的控制下,状态
总体的联系,这是在协议的控制下。isConnected()
and 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
我必须说文档在这一点上相当不清楚,并且方法名称有点误导。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)