在 Android 與 PC 建立 Socket 連線時,PC 作為 Server、手機作為 Client,核心難點在於手機如何獲取 PC 的真實區域網 IP。許多開發者只能拿到虛擬網卡(如「WiFi 精靈」建立的熱點)IP,導致連線失敗。本文提供完整解決方案。
InetAddress.getLocalHost() 或遍歷 NetworkInterface 常返回第一張非回環介面,不一定是目標區域網卡192.168.1.100(視路由器網段而定)255.255.255.0192.168.1.1)8.8.8.8 / 114.114.114.114
// PC Server 端
ServerSocket server = new ServerSocket();
server.bind(new InetSocketAddress("192.168.1.100", 5000)); // 綁定固定 IP
Socket client = server.accept();
// 處理通訊...
// Android Client 端
Socket socket = new Socket("192.168.1.100", 5000);
// 通訊邏輯...
若不想手動固定 IP,PC 端可用以下代碼自動獲取非虛擬、非回環、已連線的 IPv4:
public static String getRealLanIp() {
try {
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface ni = interfaces.nextElement();
// 過濾虛擬網卡、回環、未啟用
if (ni.isLoopback() || ni.isVirtual() || !ni.isUp()) continue;
Enumeration<InetAddress> addresses = ni.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress addr = addresses.nextElement();
if (addr instanceof Inet4Address && !addr.isLoopbackAddress()) {
String ip = addr.getHostAddress();
// 進一步過濾 169.254.x.x (APIPA)、10.0.2.15 (模擬器) 等
if (!ip.startsWith("169.254") && !ip.startsWith("10.0.2")) {
return ip;
}
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
return null;
}
vmnet、vboxnet 的介面「獲取 PC 真實 IP」的核心不是偵測技巧,而是網路拓撲設計:讓雙方處於同一物理/邏輯網段,PC 固定 IP、Server 綁定該 IP、Client 直連。避免使用「WiFi 精靈」類虛擬熱點作為通訊媒介,穩定性與速度皆有保障。