插座如何连接和关闭?

spr*_*boy 28 java sockets

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

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

我用这个条件:

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

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

connected:true closed:true bound:true

如何连接和关闭?

TIA

aio*_*obe 75

该主题对此主题进行了一些有用的讨论.事实证明,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;
}
Run Code Online (Sandbox Code Playgroud)

你也可以运行这个小测试片段:

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());
Run Code Online (Sandbox Code Playgroud)

哪个印刷品:

isConnected: false isBound: false isClosed: false
isConnected: true isBound: true isClosed: false
isConnected: true isBound: true isClosed: true
Run Code Online (Sandbox Code Playgroud)

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