1. 程式人生 > >Android websocket長連線+點對點訂閱

Android websocket長連線+點對點訂閱

專案中使用到了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());
            }
        });
    }

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