Android OkHttp3连接Socket服务器报错:HTTP 101响应异常(404)
解决OkHttp3连接WebSocket时出现
java.net.ProtocolException: Expected HTTP 101 response but was '404 Not Found'的问题 问题原因
- 你当前使用的
https://协议头不符合WebSocket规范,WebSocket连接应使用ws://(明文)或wss://(加密)作为协议前缀 - SocketIO库会自动处理WebSocket连接的路径转换与参数拼接,而OkHttp需要你明确指定服务器端SocketIO对应的WebSocket端点路径(SocketIO默认端点为
/socket.io/,且需附带协议版本等查询参数)
解决方案
- 将URL协议头替换为
wss://(匹配原https的加密连接场景) - 补充SocketIO的WebSocket端点路径及必要参数,完整URL格式应为:
wss://url.com:3003/socket.io/?EIO=4&transport=websocket(EIO版本号需与服务器端SocketIO版本对应,通常v4版本对应EIO=4)
修改后的代码
private fun run() { val client: OkHttpClient = OkHttpClient.Builder() .readTimeout(3, TimeUnit.SECONDS) .build() // 使用正确的SocketIO WebSocket端点URL val socketUrl = "wss://url.com:3003/socket.io/?EIO=4&transport=websocket" val request: Request = Request.Builder() .url(socketUrl) .build() client.newWebSocket(request, this) client.dispatcher.executorService.shutdown() }
额外说明
- 若不确定EIO版本号,可通过浏览器开发者工具查看SocketIO连接时的请求URL,直接复制对应的参数部分
- OkHttp的
newWebSocket方法会自动添加WebSocket握手所需的Upgrade: websocket和Connection: Upgrade请求头,无需手动配置
内容的提问来源于stack exchange,提问作者AlexS
相关产品推荐
相关产品推荐

