我是靠谱客的博主 鳗鱼豌豆,最近开发中收集的这篇文章主要介绍使用OkHttp的WebSocket实现长连接,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

发送心跳包(定时检查是否连接状态)

private long sendTime = 0L;
    // 发送心跳包
    private Handler mHandler = new Handler();
    // 每隔2秒发送一次心跳包,检测连接没有断开
    private static final long HEART_BEAT_RATE = 10 * 1000;
    // 发送心跳包
    private Runnable heartBeatRunnable = new Runnable() {
        @Override
        public void run() {
            if (System.currentTimeMillis() - sendTime >= HEART_BEAT_RATE) {
                //发送心跳包
                String message = "{"type":"quote"}";
                mWebSocket.send(message);
                sendTime = System.currentTimeMillis();
            }
            mHandler.postDelayed(this, HEART_BEAT_RATE); //每隔一定的时间,对长连接进行一次心跳检测
        }
    };

初始化的时候

 // 刚进入界面,就开启心跳检测
        mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE);
        connectWebSocket();

WebSocket返回的状态(注意返回的数据在子线程中,如果进行更新ui需要在主线程中更新,)

public void connectWebSocket() {
        OkHttpClient client = new OkHttpClient.Builder()
                .retryOnConnectionFailure(true)//允许失败重试
                .readTimeout(5, TimeUnit.SECONDS)//设置读取超时时间
                .writeTimeout(5, TimeUnit.SECONDS)//设置写的超时时间
                .connectTimeout(5, TimeUnit.SECONDS)//设置连接超时时间
                .build();
        String url = "ws://www.xxx.com/websocket";//web.xxx.xxx.com:xxx//服务器获取的url
        Request request = new Request.Builder().url(url).build();
        WebSocket webSocket = client.newWebSocket(request, new WebSocketListener() {
            //主要的几个方法(在子线程中回调,刷新UI记得使用Handler)
            @Override
            public void onOpen(WebSocket webSocket, Response response) {
                super.onOpen(webSocket, response);
                mWebSocket = webSocket;
                webSocket.send("{"type":"quote"}");
                //连接成功
            }

            @Override
            public void onMessage(WebSocket webSocket, String text) {
                super.onMessage(webSocket, text); //这里是子线程,不能再子线程中更新ui
                if (text.contains("connect")) {
                    return;
                } else {
                    list = new Gson().fromJson(text, WebBean.class).getData();
                    // 往handler发送一条消息 更改button的text属性
                    Message message = handler.obtainMessage();
                    message.obj=list;
                    message.what = 20;
                    handler.sendMessage(message);
                }
            }


            @Override
            public void onMessage(WebSocket webSocket, ByteString bytes) {
                super.onMessage(webSocket, bytes);

            }

            @Override
            public void onFailure(WebSocket webSocket, Throwable t, @Nullable Response response) {
                super.onFailure(webSocket, t, response);
                //连接失败调用 异常信息t.getMessage()   
                //要延迟关闭socket
           try {
                    webSocket.close(1000, null);
                    mHandler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            connectWebSocket();
                        }
                    },2000);

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

```css
 @Override
    public void onDestroy() {
        super.onDestroy();
        // 清除handler后,就不能再发送数据了
        if (mHandler != null) {
            mHandler.removeCallbacksAndMessages(null);
            mHandler = null;
        }
        if (mWebSocket != null) {
            mWebSocket.close(1000, null);
        }
        if (mHandler != null) {
            mHandler.removeCallbacksAndMessages(null);
            mHandler = null;
        }
        //清空handler
        if (handler!=null){
            handler.removeCallbacksAndMessages(null);
            handler = null;
        }
    }

最后

以上就是鳗鱼豌豆为你收集整理的使用OkHttp的WebSocket实现长连接的全部内容,希望文章能够帮你解决使用OkHttp的WebSocket实现长连接所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部