跨LAN的Java Socket TCP连接超时问题排查求助
跨LAN TCP连接超时问题排查
问题描述
尝试在两个不同局域网的设备间建立TCP连接,已在服务器路由器配置端口转发,但服务器未收到任何数据。客户端初始化Socket后,控制台未输出测试用的"connected"信息,约15秒后连接中断并抛出异常:
java.net.ConnectException: Connection timed out: connect
推测客户端未成功连接主机,需排查问题根源。
客户端代码(Client.java)
try { Socket s = new Socket("00.00.00.000", 6666); System.out.println("connected"); s.getOutputStream().write((int) (Math.random() * 10)); s.close(); } catch (UnknownHostException uhe) { uhe.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
服务端代码(Server.java)
try { ServerSocket ss = new ServerSocket(6666); while (true) { Socket s = ss.accept(); System.out.println("Server: " + s.getInputStream().read()); s.close(); } } catch (IOException e) { e.printStackTrace(); }
服务器路由器端口转发配置
端口转发参数如下:
- 外部端口:6666
- 内部IP地址:服务器所在局域网的私有IP
- 内部端口:6666
- 协议类型:TCP
排查步骤
- 修正客户端目标IP:把代码中的
00.00.00.000替换为服务器的真实公网IP,可在服务器通过IP查询网站获取。 - 核对端口转发配置:
- 确认内部IP是服务器的静态局域网IP,避免DHCP自动分配导致IP变动
- 检查外部端口、内部端口均设为6666,协议选择TCP,配置已保存并生效
- 测试端口连通性:
- 在客户端用
telnet 公网IP 6666或nc -zv 公网IP 6666命令测试端口是否可达,不通则说明端口转发未生效或有防火墙拦截
- 在客户端用
- 检查防火墙规则:
- 服务器本地防火墙需放行6666端口的TCP入站请求
- 路由器端确认未开启额外安全策略阻断6666端口
- 验证服务端状态:
- 确保服务端程序正常运行,且ServerSocket绑定的是0.0.0.0或服务器局域网IP(不能是127.0.0.1,否则仅本地可访问)
- 在服务器执行
netstat -ano | findstr 6666(Windows)或netstat -tulpn | grep 6666(Linux),确认6666端口处于监听状态
内容的提问来源于stack exchange,提问作者Conta
相关产品推荐
相关产品推荐

