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

不同API级别Android模拟器实例Socket网络连接失败排查

安卓模拟器跨API级别Socket连接失败排查

问题场景

开发最低API级别28的Java安卓应用,使用Android Studio模拟器测试Socket通信:

  • API28模拟器(IP段192.168.232.0/24)作为Server,绑定代码:
this.serverSocket = new ServerSocket();
// 绑定API28模拟器自身IP和端口55555
this.serverSocket.bind(new InetSocketAddress("192.168.232.2", 55555));
client = this.serverSocket.accept();
  • API30模拟器(IP段10.0.2.0/24)作为Client,连接代码:
this.server = new Socket("10.0.2.2", 55556);

已在Server模拟器控制台执行端口转发命令:

redir add tcp:55556:55555

但Client始终无法连接Server。

问题原因分析

  • 端口转发逻辑错误:redir命令是将开发机(电脑)的端口转发到模拟器内部端口,但当前需求是让API30模拟器访问API28模拟器的服务,这种转发方式无法实现两个模拟器间的跨段通信。
  • Server绑定IP的局限性:Server绑定了API28模拟器的特定IP192.168.232.2,跨模拟器通信时,无法通过开发机中转直接触达该绑定地址。
  • 模拟器网络隔离:不同API级别的模拟器默认处于不同虚拟网络段,彼此不能直接访问对方私有IP,必须通过开发机中转,但当前转发配置逻辑不匹配需求。

解决思路

方案一:调整端口转发实现中转访问

  1. 修改Server绑定IP:将ServerSocket绑定到0.0.0.0,允许接收来自任意网络接口的连接:
this.serverSocket.bind(new InetSocketAddress("0.0.0.0", 55555));
  1. 删除错误转发规则:在控制台执行:
redir del tcp:55556
  1. 添加正确的adb转发规则:
    • 执行adb devices获取API28模拟器的设备ID(如emulator-5554)
    • 执行转发命令,将开发机的55556端口映射到API28模拟器的55555端口:
    adb -s emulator-5554 forward tcp:55556 tcp:55555
    
  2. Client连接逻辑保持不变:继续使用new Socket("10.0.2.2", 55556),此时请求会通过开发机中转到API28模拟器的服务端口。

方案二:让两个模拟器处于同一虚拟网络

  1. 在AVD管理器中为两个模拟器配置相同的自定义虚拟网络(如统一设置为Bridge模式)
  2. 在API28模拟器中执行ifconfig(或ip addr)获取实际虚拟IP
  3. API30模拟器直接使用该IP连接Server,无需端口转发:
this.server = new Socket("192.168.232.2", 55555);

额外检查项

  • 确认两个模拟器的AndroidManifest.xml已添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  • 关闭开发机防火墙,避免拦截中转流量
  • 确保Server和Client的网络操作都在子线程中执行(安卓主线程禁止网络操作)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:20:59