Android Studio中Java多类线程实现Socket客户端消息接收时ServerSocket拒绝连接的求助
解决Android ServerSocket拒绝客户端连接的问题
我来帮你一步步排查这个卡了5小时的问题,你遇到的ServerSocket一直卡在等待连接的情况,大概率是以下几个原因导致的,咱们逐个解决:
1. 确认网络连通性与IP正确性
- 首先确保你的Android设备和运行客户端代码的电脑处于同一个WiFi局域网下,这是本地Socket连接的核心前提。
- 验证你客户端代码中使用的IP(
192.168.1.176)是否是Android设备的当前WiFi IP:- 可以在Android设备的「设置-网络和互联网-WiFi」中,点击当前连接的WiFi,查看详细信息里的IP地址。
- 或者通过ADB命令快速查看:
adb shell ip addr show wlan0,找到inet开头的那一行就是设备的WiFi IP。
- 如果IP填错了,客户端自然无法找到服务端。
2. 检查端口与防火墙限制
- 端口占用:先确认5050端口没有被Android设备上的其他应用占用。你可以临时更换一个端口(比如5051),同时修改服务端和客户端的端口号后再测试。
- Android系统防火墙:部分定制ROM(如小米、华为)自带防火墙功能,可能会默认阻止5050端口的入站连接。你可以在设备的安全设置中关闭防火墙,或者手动添加允许5050端口的规则。
- 网络权限确认:虽然你提到已经加了权限,但再核对下Manifest文件中的配置是否正确:
<uses-permission android:name="android.permission.INTERNET" /> <!-- 可选,但有助于排查网络状态问题 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
3. 修正ServerSocket的绑定方式
默认的new ServerSocket(5050)理论上会绑定到所有网络接口,但有时候可能因为系统限制导致绑定不完全。你可以尝试明确绑定到0.0.0.0(允许所有外部设备连接):
// 需要添加import java.net.InetAddress; ss = new ServerSocket(5050, 5, InetAddress.getByName("0.0.0.0"));
4. 客户端与服务端的数据流匹配(重要!)
即使后续连接成功,你的代码还有一个隐藏坑:服务端用DataInputStream.readUTF()读取数据,但客户端用PrintWriter.print("HI")发送数据,这两者的格式完全不兼容。
readUTF()要求输入的是通过DataOutputStream.writeUTF()写入的、带有长度前缀的UTF-8字符串。- 而
PrintWriter.print()只是普通字符输出,没有这个前缀,会导致服务端在读取时无限阻塞。
所以客户端代码需要修改为:
public static void main(String[] args) throws Exception { Socket socket = new Socket("192.168.1.176", 5050); DataOutputStream writer = new DataOutputStream(socket.getOutputStream()); writer.writeUTF("HI"); writer.flush(); writer.close(); socket.close(); }
5. 排查客户端连接异常
在客户端代码中添加异常捕获,看看具体的错误信息,这能帮你快速定位问题:
public static void main(String[] args) { try { Socket socket = new Socket("192.168.1.176", 5050); DataOutputStream writer = new DataOutputStream(socket.getOutputStream()); writer.writeUTF("HI"); writer.flush(); writer.close(); socket.close(); System.out.println("发送成功"); } catch (Exception e) { e.printStackTrace(); // 这里会打印具体错误,比如Connection refused(连接被拒绝) } }
建议先按照前3步排查网络和端口问题,确保客户端能成功连接上服务端(看到控制台打印"Connected"),再处理数据流的匹配问题。
内容的提问来源于stack exchange,提问作者Berna




