我是靠谱客的博主 含糊小蝴蝶,最近开发中收集的这篇文章主要介绍使用okhttp的websocket实现长连接【直接使用】,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1. 概述

有时候在开发中,我们会有一些需求是需要建立长连接的,比如自己项目中的付款码,需要商家用扫码枪来扫二维码,必须等商家扫完二维码收完款时然后发消息给客户端,这个时候就需要让客户端与服务器端建立长连接,达到让客户端与服务器端保持连接,直到收完款然后客户端自行断开连接,同时服务器端也需要在操作成功时候断开连接。

2. 具体实现

1>:添加对okhttp的依赖:

compile 'com.squareup.okhttp3:okhttp:3.8.1'

2>:连接websocket:

/**
 * Author : 马占柱
 * E-mail : mazhanzhu_3351@163.com
 * Time   : 2021/4/10 16:56
 * Desc   : Socket长连接
 */
public class WebSocketManager extends WebSocketListener {
    public static final String Action_Socket = "com.driving.driver.android.base.WebSocketManager.MZX";
    public final String TAG = "WebSocketManager";
    private final int NORMAL_CLOSURE_STATUS = 1000;
    private OkHttpClient sClient = null;
    private WebSocket sWebSocket = null;
    private String mSocketURL;
    private int neworder = 0;
    private final int ACTION_EMPTYMSG = 1400;
    private final int ACTION_FAILURE = 1401;
    private final int ACTION_MUSIC = 1402;
    private Handler handler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case ACTION_EMPTYMSG:
                    HashMap<String, Object> map2 = Http_Date.getMap();
                    map2.put("heart", "");
                    sendData(new Gson().toJson(map2));
                    // 每隔5秒发送一次心跳包,检测连接没有断开
                    handler.sendEmptyMessageDelayed(ACTION_EMPTYMSG, 5000);
                    break;
                case ACTION_FAILURE:
                    connectWebSocket();
                    handler.sendEmptyMessageDelayed(ACTION_FAILURE, 5000);
                    break;
                default:
                    break;
            }
        }
    };

    private void stopMusic() {
        neworder = 0;
        handler.removeMessages(ACTION_MUSIC);
    }

    private WebSocketManager() {

    }

    private static volatile WebSocketManager instance;

    public static WebSocketManager getInstance() {
        if (instance == null) {
            synchronized (WebSocketManager.class) {
                if (instance == null) {
                    instance = new WebSocketManager();
                }
            }
        }
        return instance;
    }

    public void connectWebSocket() {
        String mSocket = MMKV.defaultMMKV().decodeString(Constant.SOCKET, "");
        if (!Http_Date_Utils.getUserID().equals("")) {
            if (!TextUtils.isEmpty(mSocket)) {
                if (sClient == null) {
                    sClient = new OkHttpClient.Builder()
                            .readTimeout(45, TimeUnit.SECONDS)//设置读取超时时间
                            .writeTimeout(45, TimeUnit.SECONDS)//设置写的超时时间
                            .connectTimeout(45, TimeUnit.SECONDS)//设置连接超时时间
                            .build();
                }
                if (sWebSocket == null) {
                    mSocketURL = "ws://" + mSocket;
                    Request request = new Request.Builder().url(mSocketURL).build();
                    sWebSocket = sClient.newWebSocket(request, this);
                }
            }
        }
    }

    public void sendData(String info) {
        if (sWebSocket != null) {
            Log_Ma.e(TAG, mSocketURL + ",数据:" + info);
            if (!TextUtils.isEmpty(info)) {
                sWebSocket.send(info);
            }
        }
    }

    @Override
    public void onMessage(WebSocket webSocket, String text) {
        if (!TextUtils.isEmpty(text)) {
            onGetMsg(text);
        }
    }

    @Override
    public void onMessage(WebSocket webSocket, ByteString bytes) {
        if (!TextUtils.isEmpty(bytes.hex())) {
            onGetMsg(bytes.hex());
        }
    }

    @Override
    public void onClosing(WebSocket webSocket, int code, String reason) {
        Log_Ma.e(TAG, "onClosing() called with: code = [" + code + "], reason = [" + reason + "]");
        webSocket.close(NORMAL_CLOSURE_STATUS, null);
    }

    @Override
    public void onClosed(WebSocket webSocket, int code, String reason) {
        Log_Ma.e(TAG, "onClosed() called with: code = [" + code + "], reason = [" + reason + "]");
    }

    @Override
    public void onFailure(WebSocket webSocket, Throwable t, Response response) {
        Log_Ma.e(TAG, "Socket连接失败!!!----------------" + mSocketURL + "-------------连接失败!!!");
        if (sWebSocket != null) {
            sWebSocket.close(NORMAL_CLOSURE_STATUS, "Goodbye!");
            sWebSocket = null;
        }
        handler.removeMessages(ACTION_EMPTYMSG);
        handler.sendEmptyMessage(ACTION_FAILURE);
        EventBusData event = new EventBusData();
        event.setSocketType(EventBusUtils.Order_OnFailure);
        EventBus.getDefault().post(event);
    }

    @Override
    public void onOpen(WebSocket webSocket, Response response) {
        Log_Ma.e(TAG, "Socket连接成功!!!----------------" + mSocketURL + "-------------连接成功!!!");
        String userID = Http_Date_Utils.getUserID();
        HashMap<String, Object> map1 = Http_Date.getMap();
        map1.put("loginid", userID);
        sendData(new Gson().toJson(map1));
        handler.removeMessages(ACTION_FAILURE);
        handler.sendEmptyMessage(ACTION_EMPTYMSG);
    }

    public void closeWebSocket() {
        if (sWebSocket != null) {
            sWebSocket.close(NORMAL_CLOSURE_STATUS, "Goodbye!");
            sWebSocket = null;
        }
        if (sClient != null) {
            sClient = null;
        }
        if (instance != null) {
            instance = null;
        }
        handler.removeCallbacksAndMessages(null);
    }

    public void onGetMsg(String json) {
        Log_Ma.e(TAG, "接收Socket消息:" + json);
        
    }

}

最后

以上就是含糊小蝴蝶为你收集整理的使用okhttp的websocket实现长连接【直接使用】的全部内容,希望文章能够帮你解决使用okhttp的websocket实现长连接【直接使用】所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部