You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需硬编码IP地址,Android模拟器如何连接本地服务器

解决安卓模拟器自动连接本地服务器的IP问题

首先明确崩溃原因:在安卓模拟器中调用InetAddress.getLocalHost().getHostAddress()获取的是模拟器自身的回环地址(通常是127.0.0.1),而非运行服务器的主机IP,所以无法建立连接;另外网络操作不能在安卓主线程执行,这也是导致崩溃的常见诱因。

以下是几种无需硬编码IP的实现方案:

方案1:利用模拟器的特殊映射地址(简单高效)

不同安卓模拟器有固定的主机回环映射地址,适合开发测试场景:

  • Android Studio自带模拟器:10.0.2.2
  • Genymotion模拟器:10.0.3.2
  • BlueStacks模拟器:10.0.0.1

方案2:UDP广播自动发现服务器(完全自动)

服务器定时发送UDP广播,客户端监听广播获取服务器IP,实现步骤如下:

服务器端广播代码

// 服务器启动后开启广播线程
new Thread(() -> {
    try (DatagramSocket socket = new DatagramSocket()) {
        socket.setBroadcast(true);
        String broadcastMsg = "LOCAL_SERVER_FOUND";
        byte[] buffer = broadcastMsg.getBytes();
        InetAddress broadcastAddr = InetAddress.getByName("255.255.255.255");
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length, broadcastAddr, 8888);
        
        while (true) {
            socket.send(packet);
            Thread.sleep(2000); // 每2秒发送一次广播
        }
    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }
}).start();

客户端监听广播代码

// 安卓客户端需在子线程中执行网络操作
new Thread(() -> {
    try (DatagramSocket socket = new DatagramSocket(8888)) {
        byte[] buffer = new byte[1024];
        while (true) {
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
            socket.receive(packet);
            String receivedMsg = new String(packet.getData(), 0, packet.getLength());
            if ("LOCAL_SERVER_FOUND".equals(receivedMsg)) {
                String serverIp = packet.getAddress().getHostAddress();
                // 获取到IP后建立Socket连接
                Socket connection = new Socket(serverIp, 5050);
                // 后续处理连接逻辑...
                break; // 找到服务器后停止监听
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}).start();

必要配置

  1. 在安卓Manifest文件中添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- Android 12及以上需添加广播权限 -->
<uses-permission android:name="android.permission.BROADCAST_SCAN_RESULTS" />
  1. 确保主机防火墙开放5050(服务器端口)和8888(广播端口),且模拟器与主机处于同一网络环境。

内容的提问来源于stack exchange,提问作者Rising Sun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 00:56:04