You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在OkHttpClient设置pingInterval时记录WebSocket的Ping包?

如何在OkHttpClient设置pingInterval时记录WebSocket的Ping包?

嘿,我刚好遇到过类似的问题!你用普通Interceptor抓不到WebSocket的Ping包是有原因的——OkHttp的Interceptor只负责处理HTTP层面的请求响应(比如WebSocket连接的握手请求),而WebSocket建立连接后的Ping/Pong属于帧通信,不在它的处理范围内。给你两个简单有效的方法来记录Ping包:


方法一:重写WebSocketListener的onPing/onPong回调(最直接)

OkHttp的WebSocketListener本身就提供了Ping和Pong帧的回调方法,你只需要在自定义的Listener里重写这两个方法,就能直接记录Ping的发送情况,还能通过Pong确认后端是否收到。

修改你现有的代码即可:

webSocket = okHttpClient.newWebSocket(request, object : WebSocketListener() {
    override fun onOpen(webSocket: WebSocket, response: Response) {
        Timber.d("Websocket connection opened, response: $response")
    }
    override fun onMessage(webSocket: WebSocket, text: String) {
        Timber.d("Received: $text") // 这个回调正常工作,能收到消息
    }
    // 记录客户端发送的Ping帧
    override fun onPing(webSocket: WebSocket, bytes: ByteString) {
        Timber.d("已发送WebSocket Ping帧,内容:${bytes.utf8()}")
        super.onPing(webSocket, bytes) // 一定要调用super,否则OkHttp不会自动发送Pong响应
    }
    // 记录后端返回的Pong帧,用来确认后端收到了Ping
    override fun onPong(webSocket: WebSocket, bytes: ByteString) {
        Timber.d("收到WebSocket Pong帧,内容:${bytes.utf8()}")
        super.onPong(webSocket, bytes)
    }
})

这样每次OkHttpClient自动发送Ping时,onPing就会被触发,你就能在日志里看到Ping的发送记录;如果后端正常回复Pong,onPong也会打印日志,帮你确认通信链路是否正常。


方法二:使用OkHttp的日志拦截器查看底层帧日志

如果你需要更详细的传输日志(比如看到完整的帧交互过程),可以用OkHttp官方的HttpLoggingInterceptor,它能输出WebSocket的帧信息。

配置OkHttpClient如下:

// 初始化日志拦截器,设置日志级别为BODY
val loggingInterceptor = HttpLoggingInterceptor().apply {
    level = HttpLoggingInterceptor.Level.BODY
}

private val okHttpClient = OkHttpClient.Builder()
    .pingInterval(10, TimeUnit.SECONDS)
    .readTimeout(30, TimeUnit.SECONDS)
    .addInterceptor(websocketInterceptor)
    .addInterceptor(loggingInterceptor) // 添加日志拦截器
    .build()

当日志级别设为BODY时,OkHttp会输出WebSocket的帧日志,你能看到类似--> PING(发送Ping)、<-- PONG(接收Pong)的标识,这样也能确认Ping包是否发送出去。

⚠️ 注意:这个方法不要在生产环境使用,因为日志会包含所有通信内容,可能泄露敏感数据。


补充说明

你之前用的WebsocketAuthInterceptor只能拦截WebSocket的握手请求(也就是最初的HTTP升级请求),看不到后续的Ping/Pong帧,所以才没抓到Ping的记录。上面两个方法都能解决这个问题,优先推荐方法一,简单高效还能直接关联到业务逻辑。

备注:内容来源于stack exchange,提问作者faritowich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 13:49:31