温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java网络断线如何重连

发布时间:2026-10-24 07:48:19 来源:亿速云 阅读:97 作者:小樊 栏目:编程语言

在 Java 里“网络断线重连”不是某个固定 API,而是根据使用的网络方式 + 断线场景,设计重连策略。下面按常见场景系统说明,并给可复用示例。


一、先明确:断线发生在哪一层?

场景 典型技术 重连方式
TCP 长连接 Socket / Netty 检测断开 + 定时重连
HTTP 短连接 HttpClient / RestTemplate 失败重试
WebSocket WebSocket / STOMP 断线监听 + 重连
数据库 JDBC 连接池心跳 + 获取连接重试

二、Socket / TCP 长连接重连(最典型)

1️⃣ 判断断线

  • read() 返回 -1
  • read() 抛 IOException
  • 写数据抛 SocketException

2️⃣ 重连基本思路

连接失败 / 断线
   ↓
等待一段时间(避免雪崩)
   ↓
重新建立 Socket
   ↓
恢复会话(登录 / 认证)

3️⃣ 示例:Socket 自动重连

public class ReconnectSocket {
    private Socket socket;
    private volatile boolean running = true;

    public void start() {
        while (running) {
            try {
                connect();
                readLoop();
            } catch (Exception e) {
                System.out.println("断线:" + e.getMessage());
            }
            sleep(3000); // 重连间隔
        }
    }

    private void connect() throws IOException {
        socket = new Socket("127.0.0.1", 9000);
        System.out.println("连接成功");
    }

    private void readLoop() throws IOException {
        BufferedReader in = new BufferedReader(
            new InputStreamReader(socket.getInputStream()));
        String line;
        while ((line = in.readLine()) != null) {
            System.out.println("收到:" + line);
        }
    }

    private void sleep(long ms) {
        try { Thread.sleep(ms); } catch (InterruptedException ignored) {}
    }
}

✅ 关键点:

  • while(running) 保证断线后不退出
  • 重连间隔可指数退避(1s → 2s → 4s)

三、Netty 断线重连(推荐)

Netty 自带 ChannelInactive 事件。

重连处理器

public class ReconnectHandler extends ChannelInboundHandlerAdapter {

    private final Bootstrap bootstrap;
    private final EventLoopGroup group;

    public ReconnectHandler(Bootstrap bootstrap, EventLoopGroup group) {
        this.bootstrap = bootstrap;
        this.group = group;
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) {
        System.out.println("连接断开,尝试重连");
        group.schedule(() -> {
            bootstrap.connect("127.0.0.1", 9000)
                     .addListener(f -> {
                         if (!f.isSuccess()) {
                             channelInactive(ctx);
                         }
                     });
        }, 3, TimeUnit.SECONDS);
    }
}

✅ Netty 优势:

  • 非阻塞
  • 重连逻辑清晰
  • 适合高并发

四、WebSocket 断线重连

浏览器 / Java 客户端通用逻辑

WebSocketClient client = new WebSocketClient(uri) {
    @Override
    public void onOpen(ServerHandshake handshakedata) {}

    @Override
    public void onMessage(String message) {}

    @Override
    public void onClose(int code, String reason, boolean remote) {
        System.out.println("断开,重连中...");
        try {
            Thread.sleep(3000);
            reconnect();
        } catch (Exception e) {}
    }

    @Override
    public void onError(Exception ex) {}
};

五、HTTP 请求失败重试(短连接)

使用 HttpClient 重试

HttpRequest request = HttpRequest.newBuilder(uri).GET().build();

int retry = 3;
while (retry-- > 0) {
    try {
        HttpResponse<String> resp =
            HttpClient.newHttpClient().send(request, BodyHandlers.ofString());
        break;
    } catch (IOException e) {
        Thread.sleep(1000);
    }
}

✅ 建议:

  • 只重试幂等请求(GET / PUT)
  • 不重试 POST 支付类操作

六、数据库连接断线重连

✅ 使用连接池(HikariCP / Druid)

spring:
  datasource:
    hikari:
      connection-test-query: SELECT 1
      idle-timeout: 600000
      max-lifetime: 1800000

连接池会自动:

  • 检测死连接
  • 重建连接

七、重连设计的 5 个最佳实践

  1. 不要立刻重连(防止网络风暴)
  2. 指数退避
    1s → 2s → 4s → 8s
    
  3. 重连次数上限
  4. 恢复上下文(登录态 / Session)
  5. 断线通知业务层

八、你可以告诉我

  • 用的是 Socket / Netty / HTTP / WebSocket / MQ
  • 是 客户端断线 还是 服务端主动断开
  • 是否要 自动重连 + 心跳

我可以直接给你可运行的完整代码。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手