Android端Socket无法连接报400与XHR Poll error问题求助
问题排查方案
采集到的报错日志:
[{"cause": {"detailMessage": "400","stackTrace": [],"suppressedExceptions": []},"detailMessage": "xhr poll error","stackTrace": [],"suppressedExceptions": []}]
该报错属于Socket.IO框架专属错误,是框架尝试用HTTP长轮询作为WebSocket连接的回退方案时,被服务端返回400状态码拒绝,不属于原生TCP Socket的连接错误。
最高优先级排查点(适配「此前正常、近期突然报错」的场景)
- 确认服务端Socket.IO版本是否近期升级:Socket.IO v2、v3、v4大版本之间完全不兼容,服务端升级后旧版本客户端握手时会直接返回400错误。如果服务端已升级,同步将Android端
io.socket:socket.io-client依赖升级到匹配的大版本即可。 - 检查服务端近期是否新增反向代理、WAF、CDN规则:Socket.IO的握手、轮询请求需要特殊的反向代理配置,以Nginx为例,需要显式配置WebSocket协议升级、长连接超时时间,未正确配置的代理会直接拦截请求返回400;如果新增了WAF,确认是否将轮询请求判定为恶意流量进行拦截。
- 确认服务端CORS配置是否修改:Socket.IO握手请求会校验跨域来源,若服务端近期收紧了跨域规则,未将Android端的请求来源加入白名单,也会返回400错误。
- 检查Android端网络安全配置是否变更:如果连接用的是HTTP明文协议,确认近期升级targetSDK或者修改
network_security_config.xml时,没有关闭明文流量权限;如果是HTTPS协议,确认服务端SSL证书未过期、客户端没有新增证书校验规则导致握手失败。
次优先级排查点
- 检查客户端初始化Socket实例时的传参:如果近期修改了自定义请求头、query查询参数,确认参数没有未编码的特殊字符,避免服务端解析参数失败返回400。
- 测试不同网络环境下的连接表现:排除当前使用的WiFi/移动网络运营商配置了HTTP代理、篡改了请求导致异常。
- 用官方Socket.IO测试工具连接目标服务端地址:如果测试工具也无法连接,可直接定位为服务端侧问题,优先排查服务端配置;如果测试工具可正常连接,再排查Android端的依赖版本、初始化参数问题。
内容的提问来源于stack exchange,提问作者user5957595
相关产品推荐
相关产品推荐

