You need to enable JavaScript to run this app. React Native(Expo)安卓端连接Scala Play WebSocket失败排查
优惠活动
大模型
产品
解决方案
定价
更多

React Native(Expo)安卓端连接Scala Play WebSocket失败排查

核心问题成因
  • 安卓运行环境的环回地址指向和PC完全不同
    报错中提到的localhost/127.0.0.1,在安卓系统的网络逻辑里,指向的是安卓设备/模拟器自身的虚拟环回网卡,并不是运行Play WebSocket服务的PC主机。你在PC浏览器、本地HTML测试页里能连通,是因为这些测试载体本身就在PC上运行,环回地址直接指向PC本机的9000端口;但安卓端拿这个地址去连,本质是在找安卓设备自己身上的9000端口,自然找不到对应的服务。你之前测试公开的wss://echo.websocket.org能正常连,是因为这个地址是公网域名,不涉及本地环回的地址混淆问题。之前尝试把地址改成127.0.0.1依然连接失败,也完全符合这个逻辑——这个地址在安卓端的指向并没有发生变化。
  • 安卓系统默认拦截明文WebSocket流量
    安卓9.0(API 28)及以上版本,默认禁止应用发起未加密的ws://明文连接,只允许加密的wss://连接。你当前用的是ws://协议,就算后续把IP地址配对了,也会被系统网络策略直接拦截,导致连接失败。
具体调整配置

分场景替换正确的服务地址

  • 安卓模拟器调试场景:把客户端的wsUri改成ws://10.0.2.2:9000/ws。这个是安卓官方模拟器预留的固定映射地址,模拟器内访问该地址,等价于PC本机访问127.0.0.1:9000,可以直接打通模拟器到PC宿主机的网络通路。
  • 安卓物理真机调试场景:
  1. 确保真机和运行Play服务的PC连接在同一个局域网Wi-Fi下
  2. 查询PC在局域网内的IPv4地址(Windows执行ipconfig,macOS/Linux执行ip addr获取)
  3. 把客户端的wsUri改成ws://<PC局域网IP>:9000/ws,比如ws://192.168.1.105:9000/ws
  4. 临时关闭PC的系统防火墙,或单独放行9000端口的入站连接,避免防火墙拦截来自真机的访问请求。

放行安卓端的明文WS连接权限

在Expo项目的app.json的android配置块中,添加明文流量允许配置:

"android": {
  "usesCleartextTraffic": true
}

配置修改完成后,需要完全重启Expo开发服务,重新加载开发客户端才能生效,该类系统配置无法通过热更新生效。

Play端的校验检查

确认Play服务的application.conf配置中,没有强制绑定环回地址:即不要配置play.server.address = "127.0.0.1",保持默认的0.0.0.0绑定状态,允许所有网卡的流量访问服务端口。这部分配置如果错误,就算安卓端地址写对了,也会被Play服务拒绝接入。

验证方法

地址和权限配置完成后,先在安卓设备的系统浏览器中,输入对应的http://<目标地址>:9000,如果能正常打开Play的默认欢迎页,说明网络通路已经打通,此时再触发WebSocket连接就可以正常握手。从现有排查结果来看,你的Play端WebSocket路由、消息Actor的业务逻辑本身没有错误,不需要修改Scala侧的代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.07 00:15:02