代码之家  ›  专栏  ›  技术社区  ›  sproketboy

如何连接和关闭插座?

  •  27
  • sproketboy  · 技术社区  · 14 年前

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

    我使用这个条件:

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

    连接:真关闭:真绑定:真

    如何连接和关闭?

    1 回复  |  直到 14 年前
        1
  •  79
  •   aioobe    14 年前

    This thread Socket.isConnected 如果已成功连接,则返回true。

    从上面的线程:

    当你使用 Socket() 你似乎忽略了, Socket.isConnected() 告诉你 Socket.connect() 已调用 不管怎样。同样适用于 isClosed() close()

    混淆这些方法是由于混淆了 插座 ,在应用程序的控制下 整体的 连接 isConnected() 告诉我你对插座做了什么。 连接。

    医生说:

    如果套接字成功连接到服务器,则返回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