在 Java 中使用 Socket(TCP) 时,断线是常见问题。下面从原因、检测、处理、重连几个方面系统说明。
常见原因:
⚠️ TCP 是“无感知”的:
连接断了,你不去读写,是发现不了的
try {
int len = inputStream.read(buffer);
if (len == -1) {
// 服务端关闭连接
}
} catch (IOException e) {
// 断线
}
try {
outputStream.write(data);
} catch (IOException e) {
// 连接已断
}
// 每隔 N 秒发一次心跳
socket.setSoTimeout(5000);
服务端/客户端:
public void handleConnection(Socket socket) {
try {
// 读写操作
} catch (IOException e) {
// 1. 标记断线
// 2. 关闭资源
} finally {
try {
socket.close();
} catch (IOException ignored) {}
}
}
while (running) {
try {
socket = new Socket(host, port);
// 正常通信
} catch (IOException e) {
// 等待后重连
Thread.sleep(3000);
}
}
int retry = 0;
while (true) {
try {
socket = new Socket(host, port);
break;
} catch (IOException e) {
retry++;
Thread.sleep(Math.min(1000 * retry, 10000));
}
}
socket.setKeepAlive(true);
⚠️ 注意:
while (true) {
Socket socket = serverSocket.accept();
new Thread(() -> handle(socket)).start();
}
客户端断开:
✅ 必须做:
✅ 高级方案:
Netty 已处理好:
如果你愿意,可以告诉我:
我可以直接给你可运行代码示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。