插座如何连接和关闭?

时间:2010-09-13 13:54:36

标签: java sockets

我正在使用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 个答案:

答案 0 :(得分:70)

This thread就此主题进行了一些有用的讨论。事实证明,Socket.isConnected如果已成功连接,则返回true。

从以上主题:

  

当您使用Socket()时,您似乎忽视了这一点,   Socket.isConnected()告诉您是否已调用Socket.connect()   或不。同样适用于isClosed()close()

     

对这些方法的混淆是由于混淆了状态    socket ,由应用程序控制,具有状态   整个连接,它在协议的控制之下。   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

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