首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

解決Android客戶端無法連接本地Java Socket服務器的完整排查指南

     編輯:程式設計疑難解答

現象描述

開發調試階段常遇到:筆記本運行 Java ServerSocket 服務端,Java 客戶端連接正常,但 Android 客戶端始終連接失敗。雙方代碼邏輯無誤,台式機測試通過。嘗試 WiFi、網線直連均無效,且發現 `ipconfig` 顯示的 IP 與網上查詢的公網 IP 不一致。

核心原因分析

  1. IP 地址選擇錯誤: Android 手機與筆記本必須處於同一局域網(連接同一 WiFi 熱點)。需使用筆記本的局域網 IPv4 地址(如 `192.168.x.x`),而非公網 IP 或 `127.0.0.1`。
  2. 防火牆攔截: Windows 防火牆默認阻擋入站 8888 端口,需添加入站規則或臨時關閉防火牆測試。
  3. 網絡隔離: 某些路由器開啟「AP 隔離」或「客戶網絡隔離」,導致無線設備間無法互訪。
  4. Android 版本限制: Android 9.0+ 默認禁止明文 HTTP/ Socket 通信,需在 `AndroidManifest.xml` 配置 `android:usesCleartextTraffic="true"` 或使用 TLS。

標準化解決方案

步驟 1:獲取正確的服務端 IP

在筆記本 CMD 執行 `ipconfig`,找到 無線局域網適配器 WLAN 下的 IPv4 地址(示例:`192.168.0.101`)。

步驟 2:服務端代碼(含線程處理)

public class SocketServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("服務端啟動,監聽端口 8888...");

        while (true) {
            Socket client = serverSocket.accept(); // 阻塞等待連接
            new Thread(() -> handleClient(client)).start();
        }
    }

    private static void handleClient(Socket socket) {
        try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
            String msg;
            while ((msg = in.readLine()) != null) {
                System.out.println("收到消息: " + msg);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

步驟 3:Android 客戶端代碼(關鍵:子線程 + 權限)

AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application
    android:usesCleartextTraffic="true"  <!-- Android 9.0+ 必須 -->
    ... >

連接邏輯

public void connectServer(View view) {
    new Thread(() -> {
        try {
            // 替換為步驟1獲取的真實 IPv4 地址
            Socket socket = new Socket("192.168.0.101", 8888);
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            out.println("Hello from Android!");
            runOnUiThread(() -> Toast.makeText(this, "發送成功", Toast.LENGTH_SHORT).show());
        } catch (Exception e) {
            e.printStackTrace();
            runOnUiThread(() -> Toast.makeText(this, "連接失敗: " + e.getMessage(), Toast.LENGTH_LONG).show());
        }
    }).start();
}

進階排查清單

  • ✅ 手機、筆記本連接同一 WiFi(非賓客網絡)。
  • ✅ 筆記本防火牆放行 8888 端口(或關閉防火牆測試)。
  • ✅ CMD `ping 192.168.0.101` 確認網絡通暢。
  • ✅ Android 9+ 配置 `usesCleartextTraffic`。
  • ✅ 服務端綁定 `0.0.0.0`(默認 `new ServerSocket(port)` 即綁定所有網卡)。

總結

90% 的連接失敗源於 IP 地址錯誤 或 防火牆/網絡隔離。掌握「同一局域網 + 正確 IPv4 + 端口放行 + 明文流量適配」四步法,可快速定位並解決 Android Socket 連接難題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved