PC至Android设备Socket连接超时故障排查咨询
我正在开发基于Socket的客户端-服务器应用(客户端发送数据,服务器接收数据),遇到了一个奇怪的问题:
- 当平板端Android 5.1应用作为客户端、Windows 7 PC端Java应用作为服务器时,通信完全正常(平板可向PC发送数据);
- 但将平板端Android 5.1应用作为服务器、PC端作为客户端(PC向平板发送数据)时,连接根本建立不起来,报错:
java.net.ConnectException: Connection timed out: connect,而且平板和PC明明处于同一局域网。
相关代码
服务器代码(Android端)
ServerSocket ss = new ServerSocket(13005); Socket socket = ss.accept(); ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
客户端代码(PC端)
socket = new Socket(); socket.connect(new InetSocketAddress("10.2.130.125", 13005)); oos = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
补充排查信息
netstat -nap端口占用检查(已隐去外部地址),确认13005端口未被占用:
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 417 0 10.2.130.125:36844 xxx.xxx.23.74:443 CLOSE_WAIT
tcp 417 0 10.2.130.125:35996 xxx.xxx.23.110:443 CLOSE_WAIT
tcp6 1 0 ::ffff:10.2.130.125:44994 ::ffff:xxx.xx.205.170:443 CLOSE_WAIT
tcp6 0 0 ::ffff:10.2.130.125:43995 ::ffff:xx.xx.119.188:5228 ESTABLISHED
tcp6 1 0 ::ffff:10.2.130.125:42353 ::ffff:xx.xx.23.110:80 CLOSE_WAIT
tcp6 1 0 ::ffff:10.2.130.125:35722 ::ffff:xx.xx.205.170:443 CLOSE_WAIT
tcp6 1 0 ::ffff:10.2.130.125:48101 ::ffff:xx.xx.205.110:443 CLOSE_WAIT
nmap -sS -Pn -p- 10.2.130.125端口扫描结果:
Starting Nmap 7.60 ( https://nmap.org ) at 2018-01-18 16:10 W. Europe Standard Time
Nmap scan report for public-docking-cx-0635.ethz.ch (10.2.130.125)
Host is up (0.059s latency).
Not shown: 65534 filtered ports
PORT STATE SERVICE
22/tcp closed ssh
Nmap done: 1 IP address (1 host up) scanned in 159.90 seconds
- PC客户端报错堆栈:
java.net.SocketTimeoutException: connect timed out
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at inf.ethz.ch.streaming.server.main.Main$1.run(Main.java:164)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
从你的测试结果来看,核心问题是Android设备的13005端口无法被局域网内的PC访问——Nmap显示几乎所有端口都被过滤,这指向了几个常见的Android作为服务器时的障碍,我来帮你逐一排查:
1. 检查Android应用的网络权限
虽然Android 5.1不需要动态权限,但你的服务器应用必须声明INTERNET权限才能监听端口、接收外部连接。打开AndroidManifest.xml,确认是否添加了以下代码:
<uses-permission android:name="android.permission.INTERNET" />
如果没加,补上后重新安装应用再测试。
2. 确保ServerSocket绑定到所有网卡地址
默认情况下new ServerSocket(13005)应该绑定到所有可用网卡(0.0.0.0),但部分Android定制ROM可能会限制为仅本地回环(127.0.0.1),导致局域网设备无法访问。
修改服务器代码,明确绑定到所有地址:
// 绑定到0.0.0.0,允许所有网卡接收外部连接 ServerSocket ss = new ServerSocket(13005, 5, InetAddress.getByName("0.0.0.0")); Socket socket = ss.accept(); ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
3. 关闭Android设备的防火墙/安全拦截
很多Android定制系统(比如小米、华为ROM)自带防火墙,会默认阻止外部设备访问本地端口:
- 打开平板系统设置,找到「安全」或「防火墙」选项,添加规则允许13005端口的入站连接;
- 如果安装了第三方安全软件(如360手机卫士),暂时关闭或添加端口例外。
4. 检查路由器的AP隔离功能
部分路由器默认开启AP隔离(客户端隔离),这个功能会阻止同一WiFi下的设备互相访问,只能连接互联网:
- 登录路由器管理后台(通常是
192.168.1.1或192.168.0.1); - 找到「无线设置」或「局域网设置」,关闭「AP隔离」选项;
- 重启路由器后再测试连接。
5. 确保设备在同一WiFi频段
如果平板连的是2.4G WiFi,PC连的是5G WiFi,部分路由器会隔离不同频段的设备。尝试让两者连接到同一频段(比如都连2.4G),再测试。
验证步骤
修改后可以用以下方法快速验证:
- 在平板上重启服务器应用;
- 在PC上执行
telnet 10.2.130.125 13005,如果能连接成功,说明端口已经开放; - telnet通了之后,再运行客户端代码测试数据传输。
内容的提问来源于stack exchange,提问作者machinery




