Android websocket長連線+點對點訂閱

forlan_csdn發表於2018-10-09

專案中使用到了websocket長連線+點對點訂閱,部落格記錄下。
長連線通常使用的是名稱叫做STOMP的協議,具體跟伺服器端的開發人員確認即可。

直接貼乾貨:

module build.gradle新增依賴:
compile 'com.github.NaikSoftware:StompProtocolAndroid:1.1.1'
compile 'org.java-websocket:Java-WebSocket:1.3.0'
工程的build.gradle新增:
maven { url "https://jitpack.io" }

長連線通常放在service裡面

核心程式碼:

 private void connect() {
        mStompClient = Stomp.over(WebSocket.class, WS_URI);
        mStompClient.connect();
        mStompClient.lifecycle().subscribe(new Action1<LifecycleEvent>() {
            @Override
            public void call(LifecycleEvent lifecycleEvent) {
                //關注lifecycleEvent的回撥來決定是否重連
                switch (lifecycleEvent.getType()) {
                    case OPENED:
                        mNeedConnect = false;
                        Log.d(TAG, "forlan debug stomp connection opened");
                        break;
                    case ERROR:
                        mNeedConnect = true;
                        Log.e(TAG, "forlan debug stomp connection error is ", lifecycleEvent.getException());
                        break;
                    case CLOSED:
                        mNeedConnect = true;
                        Log.d(TAG, "forlan debug stomp connection closed");
                        break;
                }
            }
        });
        registerStompTopic();
    }
    
    //建立長連線,伺服器端沒有心跳機制的情況下,啟動timer來檢查長連線是否斷開,如果斷開就執行重連
    private void createStompClient() {
        connect();
        mTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                Log.d(TAG, "forlan debug in timer ======================");
                if (mNeedConnect && NetworkUtil.isNetworkConnected(getApplicationContext())) {
                    mStompClient = null;
                    connect();
                    Log.d(TAG, "forlan debug start connect WS_URI");
                }
            }
        }, RECONNECT_TIME_INTERVAL, RECONNECT_TIME_INTERVAL);
    }

    //點對點訂閱,根據使用者名稱來推送訊息
    private void registerStompTopic() {
        mStompClient.topic("/user/" + getUserAccount() + "/msg").subscribe(new Action1<StompMessage>() {
            @Override
            public void call(StompMessage stompMessage) {
                Log.d(TAG, "forlan debug msg is " + stompMessage.getPayload());
            }
        });
    }

點對點訂閱的思想:啟動長連線,針對特定的使用者推送訊息。捋明白後還是很簡單明瞭。

感謝大神的文章,讓我豁然開朗
在這裡插入圖片描述
https://blog.csdn.net/soslinken/article/details/53021510

=========================================
分割線來啦,2018.12.18更新
在這裡插入圖片描述

有同學反映topic訂閱之後沒有回撥call方法。老夫特意從伺服器端推送了訊息到之前做的apk端,發現沒有問題。幾經討論,後來此同學發現是topic訂閱的引數不正確,需要加入自己的連結。如下:

mStompClient.topic("/queue/"+“自己的連結”).subscribe(topicMessage -> {
Log.d("listenStomp", topicMessage.getPayload());
});
//要這種形式才能正常log,這麼寫就能使用成功,迷之問題。

看來是跟伺服器端STOMP版本有關係。老夫之前跟同事聯調的時候,比較幸運,並未遇到此問題。在這裡插入圖片描述

特意更新記錄下這個坑。具體請點選以下連結
https://github.com/NaikSoftware/StompProtocolAndroid/issues/130

相關文章