開發調試階段常遇到:筆記本運行 Java ServerSocket 服務端,Java 客戶端連接正常,但 Android 客戶端始終連接失敗。雙方代碼邏輯無誤,台式機測試通過。嘗試 WiFi、網線直連均無效,且發現 `ipconfig` 顯示的 IP 與網上查詢的公網 IP 不一致。
在筆記本 CMD 執行 `ipconfig`,找到 無線局域網適配器 WLAN 下的 IPv4 地址(示例:`192.168.0.101`)。
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();
}
}
}
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();
}
90% 的連接失敗源於 IP 地址錯誤 或 防火牆/網絡隔離。掌握「同一局域網 + 正確 IPv4 + 端口放行 + 明文流量適配」四步法,可快速定位並解決 Android Socket 連接難題。