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());
}
});
}
點對點訂閱的思想:啟動長連線,針對特定的使用者推送訊息。捋明白後還是很簡單明瞭。
感謝大神的文章,讓我豁然開朗
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
相關文章
- iOS和Android的點對點連線iOSAndroid
- 智對 Android 訂閱難點:教你如何應對工作中 10 種常見訂閱問題Android
- Websocket 突破最大長連線Web
- Linux測試點對點連線速度工具Linux
- Redis 訂閱 + swoole_websocket 推送RedisWeb
- websocket連線Web
- golang websocket android連線的問題GolangWebAndroid
- WebSocket斷線重連Web
- WebSocket 是什麼原理?為什麼可以實現持久連線?有點懵!!!Web
- 輪詢、長輪詢、短連線、長連線區別對比
- 雨露均沾的OkHttp—WebSocket長連線的使用&原始碼解析HTTPWeb原始碼
- 使用websocket連線(對接)asp.net core signalrWebASP.NETSignalR
- Mac下Rails連線Mysql的一點點心得MacAIMySql
- clash 實現訂閱節點與規則的分離
- iphone手機取消連續訂閱iPhone
- MQTT 客戶端出現連線訂閱等問題時如何排查?MQQT客戶端
- 長連線閘道器技術專題(六):石墨文件單機50萬WebSocket長連線架構實踐Web架構
- WebSocket連線的負載均衡Web負載
- W5500多節點連線
- WebSocket 的故事(四)—— Spingboot 中,如何利用 WebSocket 和 STOMP 快速構建點對點的訊息模式(2)Webboot模式
- WebSocket的故事(三)—— Springboot中,如何利用WebSocket和STOMP快速構建點對點的訊息模式(1)WebSpring Boot模式
- Vue+WebSocket 實現頁面實時重新整理長連線VueWeb
- Hyperf搭建websocket叢集專案(透過redis釋出訂閱)WebRedis
- 長連線和短連線
- 長連線與短連線
- Android 架構之長連線技術Android架構
- 軟連線、硬連結 和 i節點(inode)
- angular使用 websocket,少點套路,多一點真誠AngularWeb
- netty系列之:讓TCP連線快一點,再快一點NettyTCP
- [譯] Go 實現百萬 WebSocket 連線GoWeb
- Django使用channels實現Websocket連線DjangoWeb
- websocket連線mina被拒絕Web
- 體驗用yarp連線websocketWeb
- 對釋出-訂閱者模式的解析模式
- 貝塞爾曲線(Bezier curve)實現節點連線
- 以太坊公鏈節點連線節點超時問題排查
- Android洩漏模式:View中的訂閱Android模式View
- PDO 長連線