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

如何让两个Android模拟器通过WebRTC建立数据通道连接?

解决Android模拟器间WebRTC数据通道卡在Connecting的问题

核心问题分析

Android模拟器默认采用NAT网络模式,模拟器内部IP(如10.0.2.15)无法直接与另一模拟器的内部IP通信;且WebRTC会随机使用大量端口,固定端口转发无法覆盖所有需要的连接端口,最终导致ICE候选协商失败,数据通道无法完成连接。

具体解决步骤

1. 切换模拟器网络为Host模式

启动模拟器时添加-host参数,让模拟器直接使用主机的网络栈,彻底避免NAT隔离:

emulator -avd [你的AVD名称] -netdelay none -netspeed full -host

如果通过Android Studio启动,可在AVD管理器的Edit this AVD → Show Advanced Settings → Network中,将Network Mode设置为Host(部分版本可能显示为Bridge或Host-only)。

2. 配置正确的ICE服务器

在WebRTC PeerConnection配置中,同时添加STUN服务器和允许收集全类型ICE候选:

PeerConnection.RTCConfiguration config = new PeerConnection.RTCConfiguration(Arrays.asList(
    new PeerConnection.IceServer("stun:stun.l.google.com:19302")
));
// 允许收集包括host类型在内的所有候选
config.iceTransportsType = PeerConnection.IceTransportsType.ALL;

Host模式下,模拟器能收集到主机的真实IP候选,仅用STUN即可完成连通;若仍有问题,可搭建本地TURN服务器(如coturn)并添加到ICE配置中。

3. 确保ICE候选全量交换

检查代码中是否正确监听ICE候选生成事件,并将所有候选发送给对方:

peerConnection.addIceCandidateListener((sender, iceCandidate, error) -> {
    if (iceCandidate != null) {
        // 将iceCandidate序列化为JSON后发送给对等端
        sendIceCandidateToPeer(iceCandidate);
    }
});

// 接收对等端候选后必须添加到本地PeerConnection
void onIceCandidateReceived(IceCandidate candidate) {
    peerConnection.addIceCandidate(candidate);
}

打印收集到的候选,确认包含主机IP(如192.168.x.x)或127.0.0.1的候选,若只有10.0.2.15类的内部IP,说明网络模式未生效。

4. 放弃固定端口转发,改用范围转发(可选)

若无法切换Host模式,可转发WebRTC常用的端口范围:

# 转发模拟器5554的所有TCP/UDP端口到主机对应端口
adb forward -s emulator-5554 tcp:10000-65535 tcp:10000-65535
adb forward -s emulator-5554 udp:10000-65535 udp:10000-65535
# 对模拟器5556执行同样操作
adb forward -s emulator-5556 tcp:10000-65535 tcp:10000-65535
adb forward -s emulator-5556 udp:10000-65535 udp:10000-65535

此方法性能较差且仍可能存在NAT穿透问题,优先推荐Host模式。

5. 排除代码逻辑问题

先在主机的两个浏览器中测试WebRTC数据通道是否能正常建立,确认SDP交换、ICE候选协商的逻辑无错误后,再迁移到模拟器测试。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:33:15