调试 Java 中的 Socket 套接字程序,通常要从网络连通性、代码逻辑、数据收发、异常信息几个层面入手。下面按“由浅入深 + 实用工具”的方式给你一个完整思路。
ServerSocket server = new ServerSocket(9000);
Socket socket = new Socket("127.0.0.1", 9000);
✅ 检查:
在调试 Java 前,先用系统工具确认网络通不通:
# 查看端口是否监听
netstat -an | grep 9000
# 或
lsof -i:9000
# 测试端口连通性
telnet 127.0.0.1 9000
# 或
nc 127.0.0.1 9000
如果连不上:
问题在网络/端口/防火墙,不是 Java 代码
Socket 编程 90% 的问题靠异常信息解决
try {
Socket socket = new Socket(host, port);
} catch (IOException e) {
e.printStackTrace();
}
常见异常:
| 异常 | 含义 |
|---|---|
| Connection refused | 端口没开 |
| Connect timeout | 网络不通 |
| Broken pipe | 对端已关闭 |
| Socket closed | 重复操作已关闭 socket |
System.out.println(socket.isConnected());
System.out.println(socket.isClosed());
System.out.println(socket.getLocalAddress());
System.out.println(socket.getRemoteSocketAddress());
❌ 常见错误:
readLine(),客户端没写 \nwrite(),服务端用 readLine()✅ 正确示例:
// 客户端
writer.write("hello\n");
writer.flush();
// 服务端
String msg = reader.readLine();
⚠️ 一定要 flush()
BufferedReader reader =
new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer =
new PrintWriter(socket.getOutputStream(), true);
在发送和接收处都加日志:
System.out.println("发送:" + msg);
System.out.println("接收:" + line);
适合:
tcpdump -i lo port 9000
Socket 通常是多线程:
new Thread(() -> handle(client)).start();
✅ 设置:
例如只在某个客户端 IP 触发:
socket.getInetAddress().getHostAddress().equals("127.0.0.1")
❌ 1. 忘记 flush()
❌ 2. readLine() 等不到换行
❌ 3. 流关闭顺序错误
❌ 4. 服务端只处理一个连接
❌ 5. 用 available() 判断数据是否读完(不可靠)
ServerSocket server = new ServerSocket(9000);
while (true) {
Socket socket = server.accept();
new Thread(() -> {
try (BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(
socket.getOutputStream(), true)) {
String msg = in.readLine();
System.out.println("收到:" + msg);
out.println("ok");
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
Socket socket = new Socket("127.0.0.1", 9000);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
out.println("hello");
System.out.println(in.readLine());
如果你愿意,可以把:
发给我,我可以直接帮你定位具体问题。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。