Java 如何连接和关闭插座?

Java 如何连接和关闭插座?,java,sockets,Java,Sockets,我正在使用Java套接字客户端。如果服务器仍然连接到我的客户机,但它没有发送对我的消息的响应,我最终会收到一个读取超时异常 在这种情况下,我想测试一下,看看我是否应该重新连接我的套接字,或者只是保持它的重复使用 我使用这个条件: if (!socket.isConnected() || socket.isClosed() || !socket.isBound()) { try { socket.close(); } catch (IOException e1) {

我正在使用Java套接字客户端。如果服务器仍然连接到我的客户机,但它没有发送对我的消息的响应,我最终会收到一个读取超时异常

在这种情况下,我想测试一下,看看我是否应该重新连接我的套接字,或者只是保持它的重复使用

我使用这个条件:

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,其中许多是我做的。回答不错。我也对断开连接感到困惑。