OkHttp WebSocket无法监听服务器消息问题排查求助
排查OkHttp WebSocket无法接收服务器消息的问题
以下是针对你的代码和场景的排查方向及解决方案:
1. 先修正URL路径错误
你的WebSocket URL存在多余斜杠:hmcpapi//wss,这会导致服务器路径解析异常,直接修正为:
val url = "wss://infomapapp.com/hmcpapi/wss?userId=4"
2. 确认WebSocket连接是否成功建立
查看onOpen方法的日志输出:
- 如果没有打印
WebSocket connection opened,说明连接未建立:- 检查AndroidManifest.xml是否添加网络权限:
<uses-permission android:name="android.permission.INTERNET" /> - 若服务器使用自签SSL证书,需给OkHttp配置自定义信任管理器,否则会触发SSL握手失败
- 增加OkHttp超时配置,避免连接超时:
val client = OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) .build()
- 检查AndroidManifest.xml是否添加网络权限:
3. 验证是否真的收到了服务器消息
服务器返回的是两个JSON对象直接拼接的格式,先在onMessage中确保完整打印收到的文本:
override fun onMessage(webSocket: WebSocket, text: String) { Log.d("WebSocket", "Raw message received: $text") // 后续解析逻辑 }
- 如果打印了完整文本,说明消息已收到,问题出在
parseMessage方法 - 如果没有打印,说明服务器未发送消息,或消息帧格式不符合WebSocket规范
4. 修复JSON解析逻辑
服务器返回的是两个独立JSON对象拼接的字符串,单个JSON解析器无法处理,需要拆分后再解析:
private fun parseMessage(text: String): List<ChatsItem> { return try { // 按空格分割多个JSON对象 text.split(" ").filter { it.isNotEmpty() }.map { Gson().fromJson(it, ChatsItem::class.java) } } catch (e: Exception) { Log.e("ParseError", "解析失败: ${e.message}", e) emptyList() } }
同时给parseMessage添加异常捕获,避免解析失败导致后续代码终止执行。
5. 管理WebSocket生命周期
- 确保
OkHttpClient是全局单例,不要每次创建新实例 - 在Activity销毁时主动关闭WebSocket,避免资源泄漏:
override fun onDestroy() { super.onDestroy() webSocket?.close(NORMAL_CLOSURE_STATUS, "页面销毁") }
6. 测试服务器WebSocket服务可用性
用第三方工具(如wscat)直接连接服务器,验证服务是否正常:
# 安装wscat npm install -g wscat # 连接服务器 wscat -c wss://infomapapp.com/hmcpapi/wss?userId=4
如果工具也收不到消息,说明问题在服务器端,需排查服务器的WebSocket推送逻辑。
内容的提问来源于stack exchange,提问作者MãĴď
相关产品推荐
相关产品推荐

