在 Java 里“网络断线重连”不是某个固定 API,而是根据使用的网络方式 + 断线场景,设计重连策略。下面按常见场景系统说明,并给可复用示例。
| 场景 | 典型技术 | 重连方式 |
|---|---|---|
| TCP 长连接 | Socket / Netty | 检测断开 + 定时重连 |
| HTTP 短连接 | HttpClient / RestTemplate | 失败重试 |
| WebSocket | WebSocket / STOMP | 断线监听 + 重连 |
| 数据库 | JDBC | 连接池心跳 + 获取连接重试 |
read() 返回 -1read() 抛 IOExceptionSocketException连接失败 / 断线
↓
等待一段时间(避免雪崩)
↓
重新建立 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) 保证断线后不退出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 优势:
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) {}
};
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);
}
}
✅ 建议:
✅ 使用连接池(HikariCP / Druid)
spring:
datasource:
hikari:
connection-test-query: SELECT 1
idle-timeout: 600000
max-lifetime: 1800000
连接池会自动:
1s → 2s → 4s → 8s
我可以直接给你可运行的完整代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。