如何实现 Socket 编程中的断线重连机制?

在Socket编程中,断线是常见的问题,实现断线重连机制可以保证程序的可靠运行。

断线重连的主要实现步骤:

  1. 服务端和客户端建立心跳机制,定期检测连接状态。
  2. 当一定时间内未接收到心跳消息时,判断连接已断开。
  3. reconnect()方法尝试重新连接对方地址。如果连接成功,则重新启动心跳机制;如果连接失败,则重试直到成功。
  4. 重新连接成功后,需要重新建立会话等状态,以继续通信。

代码示例:
服务端

// 服务端 
ServerSocket server = new ServerSocket(8000);
Socket socket = server.accept();  
startHeartbeat(socket);   // 启动心跳机制

// 心跳机制  
private void startHeartbeat(Socket socket) {
    new Thread(() -> {
        try {
            while (true) {
                socket.getOutputStream().write("Heartbeat".getBytes());
                Thread.sleep(3000);  // 3秒发送一次心跳  
            }
        } catch (Exception e) {
            reconnect(socket);   // 连接断开,尝试重连
        }
    }).start();
}  

// 重连方法
private void reconnect(Socket socket) {
    while (true) {
        try {
            socket = new Socket("127.0.0.1", 8000);  
            startHeartbeat(socket);  // 重连成功,重启心跳机制  
            break;
        } catch (Exception e) {
            // 等待重试
        }
    }
}

客户端

// 客户端
Socket socket = new Socket("127.0.0.1", 8000);
startHeartbeat(socket); 

// 心跳机制 
private void startHeartbeat(Socket socket) {
    new Thread(() -> {
        try {
            InputStream in = socket.getInputStream();
            while (true) {
                byte[] buffer = new byte[10];
                in.read(buffer);  // 读取心跳  
                Thread.sleep(3000);  
            }
        } catch (Exception e) {
            reconnect(socket);   // 连接断开,尝试重连
        }
    }).start();  
}

// 重连方法 
private void reconnect(Socket socket) {  
    while (true) {
        try {
            socket = new Socket("127.0.0.1", 8000);
            startHeartbeat(socket);  // 重连成功,重启心跳机制
            break;
        } catch (Exception e) {
            // 等待重试
        }
    }
}