You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动