Android開發需要了解的 IM 知識

引言

即便在通訊如此發達的今天,IM 也依然是諸多場景下非常重要的基礎能力。因此做為 一名 Android 開發,不可避免的會遇到一些IM 相關的需求或問題。本文以一個Android開發的角度來講述IM 開發相關的基礎知識。

想要技術干貨、行業洞察,歡迎關注網易云信博客。
了解網易云信,來自網易核心架構的通信與視頻云服務。

IM開發需要面對的問題

  1. 網絡問題,如何高效快速的傳輸數據?
  2. 協議問題,消息如何封裝?
  3. 及時性問題,如何進行進程保活?

網絡問題

TCP 的三次握手建立連接是一個非常耗時的過程。在 IM 場景下,數據的傳輸將會非常的頻繁,如果每次傳輸都建立一個 TCP 連接,那么這個效率是不能接受的,并且頻繁的建立連接可能會發生socket錯誤,所以我們需要 “復用”TCP連接,也就是平時所說的TCP長連接。
TCP 長連接
短連接在建立后,當數據傳輸完畢時會立即關閉,下次需要傳輸數據時需要重新建立連接,在日常的業務場景非常常見,比如通過 http/https 請求獲取Server 數據。而長連接在傳輸完數據后并不會關閉,這樣下次需要傳輸數據時就可以直接使用已經建立好的連接,這中間省去了連接建立的時間。但是建立一個 TCP 長連接卻并不是“建立后不關閉”那么簡單,因為 TCP 長連接會“被動”關閉。
網絡地址轉換 (NAT)
IPv4的容量是有限的,隨著接入Internet的計算機數量的不斷猛增,IP地址資源也就愈加顯得捉襟見肘,于是也就產生了 NAT技術。簡單來說,NAT就是在局域網內部網絡中使用內部地址,而當內部節點要與外部網絡進行通訊時,就在網關(可以理解為出口,打個比方就像院子的門一樣)處,將內部地址替換成公用地址,從而在外部公網(Internet)上正常使用,NAT可以使多臺計算機共享Internet連接,這一功能很好地解決了公共 IP地址緊缺的問題。通過這種方法,可以只申請一個合法IP地址,就把整個局域網中的計算機接入Internet中。
而我們就處于運營商(移動/聯通/電信。。。)的局域網內。當我們接入運營商的網絡后,會分配到一個運營商的內部 IP地址,于是我們就可以使用這個IP地址建立連接向外傳輸數據了。但是當這個IP閑置了一段時間(NAT超時時間)后,運營商為了節約資源,會把分配給我們IP回收掉。此時如果我們還繼續使用之前那個未關閉的連接去傳輸數據,那么毫無疑問會失敗的。下面是一些運營商的 NAT超時時間。
網絡NAT超時時間中國移動3G/2G5 min中國聯通2G5 min中國電信3G大于 28 min
要想長連接一直有效,那么閑置時間就不能太長,所以在閑置時我們需要向外(Server)傳輸一些數據包,這也就是常說的“心跳包”,用于告訴運營商這個 IP 還在被使用,告訴Server 客戶端還在線。
心跳策略
心跳策略一般分為兩種:
1. 固定心跳
2. 動態心跳
這里講一下固定心跳,動態心跳可以參考 微信心跳 。固定心跳其實就是間隔固定時間發送一個心跳包。

心跳間隔 X 的值需要參考運營商的 NAT 超時時間確定,不能大于最小的 NAT超時時間,也不能太小,要不Server 的負擔非常重。一般取一個比較接近最小的NAT超時時間,比如4分鐘。

協議問題

協議決定是消息以什么樣的形式傳輸,即發送時如果對消息進行封裝,接收時如何解析。比如可以將消息體以 XML 的形式進行處理,這也就是 XMPP 協議,參考下面一個消息示意:
隔壁老王:你兒子長的比你帥多了。
老李:嘿嘿,謝謝夸獎!
<message><from>隔壁老王</from><to>老李</to><context>你兒子長的比你帥多了。</context><type>text</type>
</message><message><from>老李</from><to>隔壁老王</to><context>嘿嘿,謝謝夸獎!</context><type>text</type>
</message>復制代碼
從上面的消息示意,我們可以發現一條消息的內容可以拆分成很多屬性,而協議就是把這些屬性組合起來。
以 XML 的形式傳輸消息,最大的一個問題,就是冗余數據太多了,特別是當消息的屬性比較多時。
那么有沒什么格式能盡可能有減小冗余數據?
其實無論消息如何封裝,最終傳輸的肯定是二進制流,那么完全可以直接用二進制的形式對消息進行封裝,這也就是二進制協議。下面是一個簡單二進制協議的實現示意。
一條消息由from + to + context + type這幾個屬性組成,那么我們完全可以按順序存儲在二進制中,由于內容長度不確定,所以每個屬性的開頭我們可以使用固定字節數來記錄這個屬性的內容長度。當然,這里只是展示了一個二進制協議的例子,實際的消息會比這復雜多了,但是核心思路就是這么簡單,最終無非是設計與實現形式上的差距。

及時性問題

IM的作為即時通訊,如果無法保證消息及時觸達,那么意義就大打折扣。要保證消息及時觸達,最關鍵要做到以下兩點:
1. App 進程要盡量存活,也就是進程保活 ;
2. 在 App進程掛掉后,能夠喚醒起來;
進程保活
進程保活其實是屬于 Android 平臺的一個話題,相信大家日常開發也遇到過,細節就不在這長篇大論了,簡單的說下幾個原則:
1. 優化內存,減小內存的占用,會大大的減小被 kill 的機率;
2. 多進程,將 UI 進程與 IM 進程獨立出來,這樣 IM 的進程負擔就會小很多;
進程喚醒
嚴格意義上來說進程喚醒是屬于進程保活的一個分支,這里單獨列出來,是因為進程喚醒關注的是進程掛掉之后的動作。對于進程喚醒,這里也只列些原則,詳細的可以去查閱相關資料。
1. 靜態注冊監聽廣播(<7.0)
2. Alarm定時任務,定時去檢查進程是否存活。
3. JobScheduler定時任務,定時去檢查進程是否存活( >5.0 )
4. 接入廠商推送
網易云信(NeteaseYunXin)是集網易18年IM以及音視頻技術打造的PaaS服務產品,來自網易核心技術架構的通信與視頻云服務,穩定易用且功能全面,致力于提供全球領先的技術能力和場景化解決方案。開發者通過集成客戶端SDK和云端OPEN API,即可快速實現包含IM、音視頻通話、直播、點播、互動白板、短信等功能。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276609.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276609.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276609.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

偷梁換柱做自己的封裝系統

偷梁換柱做自己的封裝系統&#xff01;菜鳥一開始都想把自己的信息加到系統里&#xff0c;但封裝系統只會一點&#xff01;但我們可“拿來”&#xff0c;我們可以用偷梁換柱的方法來修改別人的系統&#xff0c;本文以雨林的GHOST5.0系統為例。一、準備工作1、當然是下載一個自己…

JQuery 1.6+ checkbox 狀態選擇

示例&#xff1a; HTML: <form><table><tr><td><input type"checkbox" id"select_all"/></td></tr><tr><td><input type"checkbox" name"select[]"/></td></…

臺電u盤量產工具_簡單幾步,讓U盤起死回生

如今&#xff0c;雖說云存儲風靡&#xff0c;但U盤仍存在價值&#xff0c;畢竟在很多場合并不方便上網&#xff0c;即便如此網上存儲有時也并不方便&#xff0c;也不安全。與此同時&#xff0c;如果是大文件存儲&#xff0c;云盤上傳和下載速度非常慢&#xff0c;并不適合海量數…

PXC集群常見錯誤(一)

歡迎關注MySQL 8.0必知必會系列課程。MySQL8.0必知必會-自動化部署 https://edu.51cto.com/course/16368.htmlMySQL8.0必知必會之參數標準化配置 https://edu.51cto.com/course/16358.html1.Cant start server: Bind on TCP/IP port: Address already in use…

獲取GridView中RowCommand的當前選中行的索引或主鍵Id

獲取GridView中RowCommand的當前索引行 前臺添加一模版列,里面添加一個LinkButton前臺 (如果在后臺代碼中用e.CommandArgument取值的話前臺代碼就必須在按鈕中設置CommandArgument的值&#xff0c;值為綁定的數據庫字段<asp:TemplateField HeaderText"操作"> …

系統架構師 項目經理 哪個更有前景_中央空調加地暖與五恒系統,哪個更省錢?...

每逢嚴冬酷暑,人們都會感嘆空調是最偉大的發明,并且隨著科技發展還在不斷進化。從烤火取暖到空調和地暖的供暖,從紙扇電扇的吹風到空調的制冷,人們的需求正在不斷提高,于是,為了滿足人們的需求&#xff0c;市場上又衍生出了家裝五恒系統。 恒溫、恒濕、恒氧、恒潔、恒靜這…

軟件架構基本原則

軟件架構本質上是繪制一幅復雜素描所打的草稿&#xff0c;我還說&#xff0c;如果你罩得住&#xff0c;可以不需要這個草稿。但這只是“理論上”&#xff0c;我們寫軟件&#xff0c;基本上不是在寫只有幾千行的代碼的小程序&#xff0c;而是寫數千萬行的大型程序。《道德經》說…

Smarty目錄結構和子目錄路徑問題

原文鏈接&#xff1a;http://bbs.csdn.net/topics/80223905 問題 1).最初在模板文件中使用了絕對路徑&#xff08;相對于站點根的路徑 ).如在system_info.tpl中圖片是這樣顯示的<img src"/templates/default/images/logo.gif"/>這樣當系統發布時&#xff0c;…

c++直角坐標系與極坐標系的轉換_一篇閱讀量高達2百6十多萬的關于坐標系和投影的相關知識探討...

本文轉載于CSDN作者rsyaoxin這是一篇關于坐標和投影的「神文」截止目前瀏覽量已達2698239是相關文章中不可打破的神話...文末有本文作者推薦的兩款坐標轉換的小工具下載鏈接回想一下&#xff0c;接觸遙感專業也有幾個年頭了&#xff0c;而現在越來越偏離遙感了&#xff0c;突然…

c# xmlhttp POST提取遠程webservice數據

public string cancel(string StudentID,string Mobile){string datanull;data "<?xml version1.0 encodingutf-8?><soap:Envelope xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:xsdhttp://www.w3.org/2001/XMLSchema xmlns:soaphttp://schemas.…

Javascript實現的左右滑動菜單

原文鏈接&#xff1a;http://www.cnblogs.com/miqi2214/archive/2009/04/28/1445308.html Javascript實現的左右滑動菜單 先看Demo便于理解&#xff1a;請大家往這里看 業務需求&#xff1a; 1. 菜單個數不固定&#xff0c;當菜單個數長度小于給定范圍寬度&#xff0c;則左右移…

查詢用戶分配角色TCODE

s_bce_68001419 轉載于:https://www.cnblogs.com/yangliang/archive/2009/04/13/1434862.html

query string parameters什么意思_public static void main(String[] args) 是什么意思?(轉)...

public static void main(String[] args)&#xff0c;是java程序的入口地址&#xff0c;java虛擬機運行程序的時候首先找的就是main方法。一、這里要對main函數講解一下&#xff0c;參數String[] args是一個字符串數組&#xff0c;接收來自程度序執行時傳進來的參數。如果是在控…

經典算法:位圖排序

最近發現一個有趣的排序算法&#xff0c;通過位圖來完成排序。位圖排序其實就是基數排序&#xff0c;只不過位圖排序的下標是比特位。 問題描述 輸入&#xff1a;一個最多包含n個正整數的文件&#xff0c;每個數都小于n&#xff0c;其中n10^7。如果在輸入文件中有任何正數重復出…

PHP中刪除目錄的三種方法

原文鏈接&#xff1a;http://www.chinaz.com/program/2008/1022/41645.shtml PHP中刪除目錄的三種方法 1、遞規法&#xff1a;利用遞歸一層一層的刪。 deleteDir(&#xff04;dir) { if (rmdir(&#xff04;dir)false && is_dir(&#xff04;dir)) {if (&#xff04;d…

b樣條曲面繪制 opengl_CAD制圖軟件中如何利用EXCEL輸入坐標繪制曲線?

當在使用浩辰CAD制圖軟件繪制圖紙的過程中&#xff0c;經常要繪制由多個坐標點連接成的曲線時&#xff0c;有什么方便快捷的方法嗎&#xff1f;那當然是有的。利用EXCEL表格保存數據并與CAD制圖軟件巧妙地結合起來&#xff0c;就能很容易地畫出曲線。下面給大家詳細介紹一下吧&…

根據進程名殺掉進程

foreach (System.Diagnostics.Process pro in System.Diagnostics.Process.GetProcesses()){if (pro.ProcessName "Bss"){pro.Kill();break;}} 轉載于:https://www.cnblogs.com/wolfcool/archive/2009/04/17/1438284.html

JavaScript 操作 Cookie

從事web開發也有些日子了&#xff0c;cookie 是個啥差不多能說明白&#xff0c;可是實際自己一上手操作就是得去搜索(你們懂的)&#xff0c;結果被鄙視了...所以就寫一篇博文做為自己的學習筆記&#xff0c;嘿嘿&#xff0c;博客的好處在此體現出來了。 什么是 Cookie “cookie…

阿里云服務器購買該如何選擇?阿里云服務器購買步驟流程介紹...

很多第一次購買阿里云服務器&#xff0c;不知該如何選擇適合自已的服務器。其實購買阿里云服務器&#xff0c;主要是根據自已網站的流量來決定的。如果網站流量不大&#xff0c;一天只有幾百ip&#xff0c;一般選擇1核cpu&#xff0c;1G內存&#xff0c;1MB帶寬就可以用了&…

python 切片_全面解讀Python高級特性切片

大家好&#xff0c;歡迎來到Crossin的編程教室&#xff01;眾所周知&#xff0c;我們可以通過索引值(或稱下標)來查找序列類型(如字符串、列表、元組…)中的單個元素&#xff0c;那么&#xff0c;如果要獲取一個索引區間的元素該怎么辦呢&#xff1f;切片(slice)就是一種截取索…