socket连接,判断连接中断,如果中断,并自动重连。

该博客探讨了在开发中如何判断并处理远程服务器socket连接中断的问题。作者尝试了多种方法,如检查socket状态,但未能准确判断。最终,通过使用sendUrgentData方法发送一个字节数据来检测连接状态,当发送失败则触发重连。提供了一个监听连接线程的示例代码,用于不断检测并尝试重新连接到服务器。
摘要由CSDN通过智能技术生成

    最近在开发中遇到一个问题,就是如何判断远端服务器是否已经断开连接,如果断开那么需要重新连接。

      首先想到socket类的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但经过试验并查看相关文档,这些方法都是本地端的状态,无法判断远端是否已经断开连接。

      然后想到是否可以通过OutputStream发送一段测试数据,如果发送失败就表示远端已经断开连接,类似ping,但是这样会影响到正常的输出数据,远端无法把正常数据和测试数据分开。

     最后又回到socket类,发现有一个方法sendUrgentData,查看文档后得知它会往输出流发送一个字节的数据,只要对方Socket的SO_OOBINLINE属性没有打开,就会自动舍弃这个字节,而SO_OOBINLINE属性默认情况下就是关闭的,太好了,正是我需要的!

     于是,下面一段代码就可以判断远端是否断开了连接:

 

  1. try{
  2.       socket.sendUrgentData(0xFF);
  3. }catch(Exception ex){
  4.       reconnect();
  5. }

 

————————————————————

如果长连接中断了,可以使用以下代码示例自动重连: ```java import java.net.*; import java.io.*; public class Client { private Socket socket; private BufferedReader in; private PrintWriter out; private boolean connected; public void startConnection(String ipAddress, int port) { try { socket = new Socket(ipAddress, port); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(), true); connected = true; } catch (IOException e) { System.out.println("Error connecting to server: " + e.getMessage()); // 如果连接失败,则等待一段时间后重新连接 try { Thread.sleep(5000); } catch (InterruptedException ex) { ex.printStackTrace(); } startConnection(ipAddress, port); // 递归调用自身重新连接 } } public void sendMessage(String message) { if (connected) { out.println(message); } } public void stopConnection() { try { in.close(); out.close(); socket.close(); connected = false; } catch (IOException e) { System.out.println("Error closing connection: " + e.getMessage()); } } public void listenForMessages() { try { String message; while (connected && (message = in.readLine()) != null) { // 处理从服务器接收到的消息 System.out.println("Received message: " + message); } // 如果连接断开,则等待一段时间后重新连接 try { Thread.sleep(5000); } catch (InterruptedException ex) { ex.printStackTrace(); } startConnection(socket.getInetAddress().getHostAddress(), socket.getPort()); // 递归调用自身重新连接 } catch (IOException e) { System.out.println("Error listening for messages: " + e.getMessage()); } } } ``` 在上面的示例中,当连接建立失败时,会等待 5 秒后再次尝试连接。当连接断开时,也会等待 5 秒后重新连接。这里使用递归调用 `startConnection` 方法来实现自动重连
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值