sockets如何连接和关闭?

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

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

我用这个条件:

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

该主题对此主题进行了一些有用的讨论。 事实certificate,如果Socket.isConnected已成功连接, Socket.isConnected返回true。

从上面的post:

当您使用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 

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