Android客戶端socket長連線通訊總結

2021-08-27 04:57:26 字數 1329 閱讀 1717

最近有三個專案是做校園物聯網相關的,已經完成了兩個,之前的校園裝置管控也是長連線通訊專案,對客戶端長連線通訊還是有了一定的經驗與心得,自此做些總結筆記之類,不講**裡面的東西。

第乙個基於socket長連線的專案是裝置管控專案,剛開始並沒有使用socket長連線,而是採用了定時重新整理資料的方式,後面就改用socket長連線。這個專案其實是有兩個伺服器端,socket伺服器端是直接控制教室裝置的,pc的客戶端也是與該伺服器保持長連線通訊,所以可以共用,通訊資料是xml格式。後面兩個專案的socket伺服器設計結合了之前專案的缺點,採用的是json格式傳遞資料。

自己直接使用socket寫通訊框架,那一時間估計不大現實,所以我第一時間是看第三方的socket長連線通訊的框架。第乙個專案採用的是mina,後面的專案採用的是netty。

我個人對這兩個通訊框架並沒有很深入的了解,只能講一下我使用的大概的感受,mina應該是比較老的了,怎麼說,用起來比較簡單點,但是斷開後沒有自動重連機制,**結構沒有那麼清晰,也可能是我初次長連線使用,考慮的不是很周全。netty比較新,功能更強大些,帶有自動斷開重連,通過新增channelhandler新增想要的模組,**結構更清晰點,想資料編碼解碼等可以使用或者繼承已有的,更加方便些,個人還是比較推薦使用netty。

下面記錄下我遇到的一些問題的以及處理方式:

1.如何保持長連線通訊。

通過定時傳送心跳包即可,傳送頻率與伺服器協調好,超時多久就認為斷開連線,然後執行重連吧。

2.網路斷開重連問題

也有可能是網路波動導致網路忽然斷開或者超時了,這時檢測到需要重連。重連有兩種,第一在原來連線上執行重連,netty的自動重連就是在原連線上進行重連的,第二是重新建立起新的連線,我一般做法是在原來連線上嘗試連線,連線超過一定次數比如20次,就執行建立新的連線。

3.傳遞大量資料的問題

這個需要伺服器考慮進行分包,在訊息頭進行標識是否還有別的訊息包。

4.粘包的問題

需要伺服器對每個訊息報進行標記,可以有兩種處理方式,1.每個完整的訊息報帶有乙個訊息結束符 2.在每個訊息頭標識當前訊息包的資料長度,根據資料長度擷取。

5.熄屏後服務掛起的問題

其實不只是服務掛起,cpu都可能掛起,如果是原生系統可能還好點,這裡提供我的兩個解決方案:1.提供喚醒鎖定把cpu保持喚醒,但是比較耗電 2.提供鬧鐘定時喚醒cpu,並保持短時間喚醒cpu如何執行傳送心跳等操作。

6.執行緒切換引起的問題

我使用netty,如果不切換回主線程更新介面,會導致拋異常,服務斷開,接著不斷執行重連。

android客戶端 AsyncTask的使用

在開發android移動客戶端的時候往往要使用多執行緒來進行操作,我們通常會將耗時的操作放在單獨的執行緒執行,避免其占用主線程而給使用者帶來不好的使用者體驗。但是在子執行緒中無法去操作主線程 ui 執行緒 在子執行緒中操作ui執行緒會出現錯誤。因此android提供了乙個類handler來在子執行緒...

android 客戶端 Cookie處理

android 客戶端 cookie處理 cookie,有時也用其複數形式cookies,指某些 為了辨別使用者身份 進行session跟蹤而儲存在使用者本地終端上的資料 通常經過加密 cookie最早是網景公司的前 雇員lou montulli在1993年3月的發明。cookie是由伺服器端生成,...

瘦客戶端 胖客戶端 智慧型客戶端

胖客戶端模式將應用程式處理分成了兩部分 由使用者的桌面計算機執行的處理和最適合乙個集中的伺服器執行的處理。乙個典型的胖客戶端包含乙個或多個在使用者的pc上執行的應用程式,使用者可以檢視並運算元據 處理一些或所有的業務規則 同時提供乙個豐富的使用者介面做出響應。伺服器負責管理對資料的訪問並負責執行一些...