Node.js+Socket.IO服务端与Android客户端XHR Polling错误排查求助
Socket.IO Android客户端XHR Polling错误排查建议
背景
已搭建Socket.IO服务端-客户端架构:
- Node.js服务端代码验证正常,Node.js客户端测试脚本可正常收发消息
- Android客户端尝试使用
dev.icerock.moko:socket-io:0.4.0和io.socket:socket.io-client:1.0.0两个库,均出现XHR Polling错误,错误日志如下:
moko.socket: error io.socket.engineio.client.EngineIOException: xhr poll error moko.socket: error io.socket.client.SocketIOException: Connection error
服务端运行在本地机器,Android设备与服务端处于同一WiFi网络,尝试NGROK代理后问题仍存在。
排查步骤
1. 修正服务端IP配置不一致问题
服务端启动日志显示监听地址为http://192.168.0.191:3000,但Android客户端代码中连接的是http://192.168.0.10:3000,IP地址不匹配是直接导致连接失败的核心问题,先修正客户端连接地址为服务端实际IP。
2. 验证Socket.IO版本兼容性
不同版本的Socket.IO客户端与服务端存在严格兼容性要求:
- 执行
npm list socket.io查看服务端socket.io包版本 - 匹配客户端库版本:
io.socket:socket.io-client:1.0.0对应服务端Socket.IO v1.xdev.icerock.moko:socket-io:0.4.0基于Socket.IO v4.x,需服务端为v4.x版本
若版本不兼容,升级/降级服务端或客户端至匹配版本。
3. 配置服务端CORS策略
默认情况下Socket.IO服务端的CORS配置可能限制跨域请求,修改服务端代码添加显式CORS配置:
const io = new Server(server, { cors: { origin: "*", // 测试阶段允许所有来源,生产环境指定具体域名/IP methods: ["GET", "POST"] } });
4. 调整客户端传输方式
强制客户端使用WebSocket传输,跳过XHR Polling尝试:
- 对于moko socket-io库:
config = SocketOptions( queryParams = mapOf("payload" to "MyPayload"), transport = SocketOptions.Transport.WEBSOCKET )
- 对于官方socket.io-client库:
val opts = IO.Options() opts.transports = arrayOf("websocket") val socket = IO.socket("http://192.168.0.191:3000", opts)
5. 检查Android网络配置细节
- 确认
network_security_config.xml中配置的域名与服务端IP一致(当前配置为192.168.0.191,需与客户端连接地址匹配) - 确保
AndroidManifest.xml中android:usesCleartextTraffic="true"已正确配置,且无其他网络安全策略覆盖 - 关闭Android设备上的代理、VPN等网络拦截工具,通过ping服务端IP验证网络连通性
6. 增加日志详细度
- 服务端开启debug日志:
const io = new Server(server, { // ...其他配置 logger: true, transports: ["websocket", "polling"] });
- Android客户端捕获完整异常堆栈:
on(SocketEvent.Error) { it.printStackTrace() println("moko.socket: error ${it.message}") }
内容的提问来源于stack exchange,提问作者Coach Roebuck
相关产品推荐
相关产品推荐

