如何连接和关闭插座?

2022-09-01 11:18:22

我使用的是 Java 套接字客户端。在服务器仍然连接到我的客户端但没有对我的消息发送响应的情况下 - 我最终得到一个读取超时异常。

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

我使用这个条件:

if (!socket.isConnected() || socket.isClosed() || !socket.isBound()) {
    try {
        socket.close();
    } catch (IOException e1) {
    }
    // Wait on a new connection
    socket = connectSocket(.....);
}

但我似乎总是重新建立联系。当我记录布尔属性的值时,我看到这个:

连接: 真闭合: 真绑定: 真

如何连接和关闭它?

断续器


答案 1

此线程有一些关于此主题的有用讨论。事实证明,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

我必须说,文档在这一点上非常不清楚,并且方法名称有点误导。


答案 2

推荐