首页 文章

插座如何连接和关闭?

提问于
浏览
27

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

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

我用这个条件:

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

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

connected:true closed:true bound:true

如何连接和关闭?

TIA

1 回答

  • 70

    This thread就此主题进行了一些有益的讨论 . 事实证明,如果(曾经)成功连接,Socket.isConnected将返回true .

    从上面的帖子:

    当您使用Socket()时,您似乎忽略了它,Socket.isConnected()会告诉您是否已调用Socket.connect() . 类似地,对于isClosed()和close() . 对这些方法的混淆是由于在应用程序的控制下将套接字的状态与协议控制下的整体连接状态混淆 . isConnected()和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
    

    我必须说文档在这一点上还不太清楚,而且方法名称有点误导 .

相关问题