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

Android Socket 通信:客戶端連不上服務端的經典排查清單

     編輯:程式設計疑難解答

問題現場

Java Server + Android Client 同一局域網/內網,代碼邏輯無誤,但 Client 無法連接 Server。嘗試 127.0.0.1(回環地址)亦失敗。

核心排查清單(按概率排序)

  1. 網絡互通性:
    • 手機與 Server 是否**同一 Wi-Fi/熱點/有線網段**?
    • 手機瀏覽器能否訪問 https://:?
    • adb shell ping 是否通?
  2. Server 綁定地址:ServerSocket 必須綁定 0.0.0.0 或具體 LAN IP,**不能只綁 127.0.0.1**(僅本機可訪問)。
  3. 端口與防火牆:Server 端口未被佔用,Windows 防火牆/雲服務器安全組**放行該端口入站**。
  4. Android 權限:AndroidManifest.xml 聲明 <uses-permission android:name="android.permission.INTERNET" />。
  5. 主線程網絡操作:Android 4.0+ 嚴禁主線程聯網,**必須在子線程/協程/RxJava/协程中建立 Socket 連接**,否則拋 NetworkOnMainThreadException。
  6. IP 地址填寫:Client 連接時填寫 **Server 的 LAN IP**(如 192.168.1.100),而非 127.0.0.1、localhost、公網 IP(除非做了端口映射)。
  7. 靜態 IP/域名:生產環境建議 Server 固定靜態 IP 或綁定域名,避免 DHCP 換 IP 導致 Client 失聯。

快速驗證腳本

// Server 端測試(Java)
new Thread(() -> {
    try (ServerSocket ss = new ServerSocket(8888)) {
        System.out.println("Server listening on 0.0.0.0:8888");
        while (true) new Thread(() -> handle(ss.accept())).start();
    } catch (IOException e) { e.printStackTrace(); }
}).start();

// Client 端測試(Android/Kotlin 協程)
lifecycleScope.launch(Dispatchers.IO) {
    try {
        Socket socket = Socket("192.168.1.100", 8888) // 換成實際 Server LAN IP
        // 通信邏輯...
    } catch (e: Exception) { Log.e("Socket", "Connect failed", e) }
}

90% 連接失敗源於「網絡不通」「綁定 127.0.0.1」「主線程聯網」「防火牆攔截」,逐項核對通常 10 分鐘內定位解決。

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