日记: 使用OkHttp请求WebSocket.报错onFailure

在尝试使用OkHttp进行WebSocket请求时遇到了错误,问题出现在RealWebSocket的onFailure方法被调用。错误源于WebSocketListener的onFailure回调,由于转换问题导致。尽管异常发生,但未抛出,而是直接进入了onFailure。问题的根源在于WebSocket监听器的onOpen方法中格式化字符串缺失%s。解决这个问题的经验教训包括重视测试用例,避免在调试时复制可能存在问题的代码,遇到问题时查阅文档和源码,以及对OkHttp的设计进行讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用okhttp请求WebSocket报错执行了WebSocketListener中onFailure方法, 这个问题让我找了2个小时所以记录下来 ┌────────────────────────────────────── │ RealWebSocket.failWebSocket (RealWebSocket.java:546) │ WebsocketWorker$MyWebSocketListener.onFailure (WebsocketWorker.java:117) ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ │ onFailure:Throwable:Conversion: , Response:null └──────────────────────────────────────

这里是WebSocketListener监听回调使用打印库为com.orhanobut:logger

public static class MyWebSocketListener extends WebSocketListener {
        @Override
        public void onOpen(WebSocket webSocket, Response response) {
            super.onOpen(webSocket, response);
            Logger.i("onOpen:%", response);
        }
        @Override
        public void onMessage(WebSocket webSocket, ByteString bytes) {
            super.onMessage(webSocket, bytes);
            Logger.i("onMessage:%", bytes);
        }
        @Override
        public void onMessage(WebSocket webSocket, String text) {
            super.onMessage(webSocket, text);
            Logger.i("onMessage:%", text);
        }
        @Override
        public void onClosed(WebSocket webSocket, int code, String reason) {
            super.onClosed(webSocket, code, reason);
            Logger.i("onClosed:code:%d, reason:%s", code, reason);
        }
        @Override
        public void onClosing(WebSocket webSocket, int code, String reason) {
            super.onClosing(webSocket, code, reason);
            Logger.i("onClosing:code:%d, reason:%s", code, reason);
        }
        @Override
        public void onFailure(WebSocket webSocket, Throwable t, @Nullable Response response) {
            super.onFailure(webSocket, t, response);
117           Logger.i("onFailure:Throwable:%s, Response:%s", t.getMessage(), response); //报错位置
        }
    }

原因:websocket监听回调执行onOpen方法, 由于格式化缺少%s所以报错,但是没有抛出错误而是执行onFailure回调了 okhttp中的RealWebSocket.java

 // Process all web socket messages.
        try {
          listener.onOpen(RealWebSocket.this, response);
          String name = "OkHttp WebSocket " + request.url().redact();
          initReaderAndWriter(name, pingIntervalMillis, streams);
          streamAllocation.connection().socket().setSoTimeout(0);
          loopReader();
        } catch (Exception e) {
          failWebSocket(e, null);
        }

找问题心得

  1. 使用测试用例很重要
  2. 写测试代码不要使用原代码可能存在debug
  3. 遇见问题看文档,看代码,网上找

okhttp这样设计合理吗? 请评论

转载于:https://my.oschina.net/xtdhwl/blog/1587440

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值