現(xiàn)在很多社交軟件都很火,F(xiàn)aceBook、易信、陌陌等,QQ、微信當(dāng)然依然是中文社交最大霸主。除此之外伙星也很火。除了社交軟件用到即時通訊,商城類的軟件也會涉及到買家與賣家的商談,還有美食類軟件,一般都會有評論,有用戶之間的交流等等,幾乎有用戶資源的軟件都會有即時通訊的需求。因此,即時通訊也是很重要的,不管目前所在的公司是否重視,但作為一個開發(fā)者不得小視。今天給大家聊一下即時通訊相關(guān)的內(nèi)容。大家可以相互交流學(xué)習(xí)一下。
一、定義
XMPP(可擴展消息處理現(xiàn)場協(xié)議)是基于可擴展標(biāo)記語言(XML)的協(xié)議,它用于即時消息(IM)以及在線現(xiàn)場探測。它繼承了在XML環(huán)境中靈活的發(fā)展性。因此,基于XMPP的應(yīng)用具有超強的可擴展性。經(jīng)過擴展以后的XMPP可以通過發(fā)送擴展的信息來處理用戶的需求,以及在XMPP的頂端建立如內(nèi)容發(fā)布系統(tǒng)和基于地址的服務(wù)等應(yīng)用程序。而且,XMPP包含了針對服務(wù)器端的軟件協(xié)議,使之能與另一個進行通話,這使得開發(fā)者更容易建立客戶應(yīng)用程序或給一個配好系統(tǒng)添加功能。
通俗的來說,其實XMPP 是一種很類似于http協(xié)議的一種數(shù)據(jù)傳輸協(xié)議,它的過程就如同“解包裝--〉包裝”的過程,用戶只需要明白它接收的類型,并理解它返回的類型,就可以很好的利用xmpp來進行數(shù)據(jù)通訊。
二、基本網(wǎng)絡(luò)結(jié)構(gòu)
XMPP中定義了三個角色,客戶端,服務(wù)器,網(wǎng)關(guān),通信能夠在這三者的任意兩個之間雙向發(fā)生。服務(wù)器同時承擔(dān)了客戶端信息記錄,連接管理和信息的路由功能。網(wǎng)關(guān)承擔(dān)著與異構(gòu)即時通信系統(tǒng)的互聯(lián)互通,基本的網(wǎng)絡(luò)形式是單客戶端通過TCP/IP,UDP連接到單服務(wù)器,然后在之上傳輸XML
三、功能
傳輸?shù)氖桥c即時通訊相關(guān)的指令。在以前這些命令要么用2進制的形式發(fā)送(比如QQ),要么用純文本指令加空格加參數(shù)加換行符的方式發(fā)送(比如MSN)。而XMPP傳輸?shù)募磿r通訊指令的邏輯與以往相仿,只是協(xié)議的形式變成了XML格式的純文本
四、優(yōu)缺點? ? ? ? OpenFire服務(wù)器
優(yōu)點:XMPP協(xié)議是自由、開放、公開的,并且易于了解。而且在客戶端、服務(wù)器、組件、源碼庫等方面,都已經(jīng)各自有多種實現(xiàn)。XMPP除了可用在實時通信的應(yīng)用程序,還能用在網(wǎng)絡(luò)管理、內(nèi)容供稿、協(xié)同工具、文件共享、游戲、遠程系統(tǒng)監(jiān)控等。
缺點:XMPP協(xié)議的方式被編碼為一個單一的長的XML文件,因此無法提供修改二進制數(shù)據(jù)。
五、第三方
即時通訊開發(fā)通常都是用的第三方,目前主要有環(huán)信、融云。
1.環(huán)信:http://www.easemob.com
目前創(chuàng)建群組支持的配置屬性有:
1 群名稱
2 群描述
3 群人數(shù)(不支持修改,目前上限為2000人)
4 群類型(即上面提到的四種群組類型)
群組分4種類型,目前SDK不支持自主選擇是否進群。我們將針對每種類型講解加入群組要進行的操作。
1 eGroupStyle_PrivateOnlyOwnerInvite 該類型的群組只允許群主(owner)添加人進群,其他人無法主動加入。
2 eGroupStyle_PrivateMemberCanInvite (推薦使用),該類型的群組允許所有群成員添加人進群,其他人無法主動加入。
3 eGroupStyle_PublicJoinNeedApproval (推薦使用),該類型的群組只允許群主(owner)添加人進群;其他人想進入群組的話,需要先發(fā)送申請,群主同意申請之后才能進群;其他人無法主動加入。
4 eGroupStyle_PublicOpenJoin (不推薦使用),該類型的群組允許任何人主動加入群組。
聊天室”模型:
1 進入聊天頁面之前,進行加入聊天室操作;
2 成功進入聊天室之后,服務(wù)器會自動給推10條消息;
3 離開聊天頁面之后,進行退出聊天室操作;
4 聊天室創(chuàng)建者owner可以進行退出聊天室操作;
5 支持最大成員5000;
6 環(huán)信的聊天室內(nèi)僅有owner和游客;
7 不支持客戶端建立聊天室;
8 不支持客戶端邀請;
9 不支持REST邀請;
10 聊天室內(nèi)成員離線后,服務(wù)器當(dāng)監(jiān)聽到此成員不在線后不在會給此成員再發(fā)推送。
2.融云:http://www.rongcloud.cn
借助第三方開發(fā)一般 只有SDK文檔能夠讀懂,開發(fā)方面都沒有太大問題,除非官方網(wǎng)站很久沒更新文檔了,新的界面和文檔對不上或者有很多的錯誤。這才是最坑的。所以這方面平時多看有坑的就需要借助論壇來解決了,大家的力量才是巨大的。
下面介紹一下Socket相關(guān)概念
一、概念
網(wǎng)絡(luò)上的兩個程序通過一個雙向的通信連接實現(xiàn)數(shù)據(jù)的交換,這個連接的一端就被稱為一個socket
Socket的英文原意指的是“孔”或者“插座”,專業(yè)術(shù)語被稱為“套接字”,用于描述IP地址和端口,可以用來實現(xiàn)不同虛擬機或不同計算機之間的通信。應(yīng)用程序通常通過"套接字"向網(wǎng)絡(luò)發(fā)出請求或者應(yīng)答網(wǎng)絡(luò)請求。
二、舉例說明
比如:Socket正如其英文原意那樣,像一個多孔插座。一臺主機猶如布滿各種插座的房間,每個插座有一個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節(jié)目。 客戶軟件將插頭插到不同編號的插座,就可以得到不同的服務(wù)
對于一個網(wǎng)絡(luò)連接來說,套接字是平等的,并沒有差別,不會因為是服務(wù)器端或者客戶端而產(chǎn)生不同的級別。
三、主要參數(shù)
區(qū)分不同應(yīng)用程序進程間的網(wǎng)絡(luò)通信和連接,主要有3個參數(shù):通信的目的IP地址、使用的傳輸層協(xié)議(TCP或UDP)和使用的端口號,通過將這三個參數(shù)結(jié)合起來,與一個Socket綁定,應(yīng)用層就可以和傳輸層通過套接字接口,區(qū)分來自不同應(yīng)用程序進程或網(wǎng)絡(luò)連接的通信,實現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)。
Socket可以看成兩個程序進行通訊連接中的一個端點,是連接應(yīng)用程序和網(wǎng)絡(luò)驅(qū)動程序的橋梁,Socket在應(yīng)用程序中創(chuàng)建,通過綁定與網(wǎng)絡(luò)驅(qū)動建立關(guān)系。此后,應(yīng)用程序發(fā)送給Socket的數(shù)據(jù),由Socket交給網(wǎng)絡(luò)驅(qū)動程序向網(wǎng)絡(luò)上發(fā)送出去,計算機從網(wǎng)絡(luò)上收到與該Socket綁定IP地址和端口號相關(guān)的數(shù)據(jù)后,由網(wǎng)絡(luò)驅(qū)動程序交給Socket,應(yīng)用程序便可從該Socket中提取接收到的數(shù)據(jù),網(wǎng)絡(luò)應(yīng)用程序就是這樣通過Socket進行數(shù)據(jù)的發(fā)送與接收。
三、連接過程
要通過Internet進行通信,至少需要一對套接字,其中一個運行在客戶端,稱之為ClientSocket,另一個運行在服務(wù)器端,稱之為ServerSocket,根據(jù)連接啟動的方式以及本地套接字要連接的目標(biāo),套接字之間的連接過程可以分為三個步驟:服務(wù)器監(jiān)聽,客戶端請求,連接確認(rèn)
(1)服務(wù)器監(jiān)聽:是服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實時監(jiān)控網(wǎng)絡(luò)狀態(tài)
(2)客戶端請求: 是指由客戶端的套接字提出連接請求,要連接的目標(biāo)是服務(wù)器端的套接字,為此,客戶端的套接字必須首先描述他要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的IP地址和端口號,然后就向服務(wù)器端套接字提出連接請求。
(3)連接確認(rèn):是指服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求,它就響應(yīng)客戶端套接字的請求,建立一個新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認(rèn)了此描述,連接就建立好了,而服務(wù)器端套接字仍然處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求
四、數(shù)據(jù)處理
使用套接字進行數(shù)據(jù)處理有兩種基本模式:同步模式和異步模式
(1) 同步模式:特點是在通過Socket進行連接、接收、發(fā)送數(shù)據(jù)時,客戶機和服務(wù)器在接收對方響應(yīng)前會處于阻塞狀態(tài),即一直等待收到對方請求后才繼續(xù)執(zhí)行下面的語句,如此可見,同步模式只適用于數(shù)據(jù)處理不太多的場合,當(dāng)程序執(zhí)行的任務(wù)很多時,長時間的等待可能會讓用戶無法忍受。
(2) 異步模式:特點是在通過Socket進行連接、接收、發(fā)送操作時,客戶機和服務(wù)器不會處于阻塞方式,而是利用callback機制進行連接、接收、發(fā)送處理,這樣就可以在調(diào)用發(fā)送或接收的方法后直接返回,并繼續(xù)執(zhí)行下面的程序,由此可見,異步套接字特別適用于進行大量數(shù)據(jù)處理的場合。
五、TCP和UDP
TCP和UDP的區(qū)別? 各有什么優(yōu)缺點
1、TCP
TCP(傳輸控制協(xié)議)是面向連接的協(xié)議,也就是說,在收發(fā)數(shù)據(jù)前,必須和對方建立可靠的連接。一個TCP連接必須經(jīng)過三次“對話”才能建立起來,其中的過程非常復(fù)雜,簡單地過程如下:
A —> B? 主機A向主機B發(fā)出連接請求數(shù)據(jù)包,這是第一次對話
A <—B 主機B向主機A發(fā)送同意連接和要求同步(同步就是兩臺主機一個在發(fā)送,一個在接收,協(xié)調(diào)工作),這是第二次對話
A —> B 主機A再發(fā)出一個數(shù)據(jù)包確認(rèn)主機B的要求同步,這是第三次對話
TCP接通連接要進行3次握手過程? ??
1、主機A通過向主機B 發(fā)送一個含有同步序列號的標(biāo)志位的數(shù)據(jù)段給主機B ,向主機B 請求建立連接,通過這個數(shù)據(jù)段,
主機A告訴主機B 兩件事:我想要和你通信;你可以用哪個序列號作為起始數(shù)據(jù)段來回應(yīng)我.
2、 主機B 收到主機A的請求后,用一個帶有確認(rèn)應(yīng)答(ACK)和同步序列號(SYN)標(biāo)志位的數(shù)據(jù)段響應(yīng)主機A,也告訴主機A兩件事:我已經(jīng)收到你的請求了,你可以傳輸數(shù)據(jù)了;你要用哪佧序列號作為起始數(shù)據(jù)段來回應(yīng)我
3、 主機A收到這個數(shù)據(jù)段后,再發(fā)送一個確認(rèn)應(yīng)答,確認(rèn)已收到主機B 的數(shù)據(jù)段:我已收到回復(fù),我現(xiàn)在要開始傳輸實際數(shù)據(jù)了
這樣3次握手就完成了,主機A和主機B 就可以傳輸數(shù)據(jù)了.
三次握手的特點:沒有應(yīng)用層的數(shù)據(jù);
SYN這個標(biāo)志位只有在TCP建立連接時才會被置1;
握手完成后SYN標(biāo)志位被置0
涉及到的名詞解釋:
ACK TCP報頭的控制位之一,對數(shù)據(jù)進行確認(rèn).確認(rèn)由目的端發(fā)出,用它來告訴發(fā)送端這個序列號之前的數(shù)據(jù)段
都收到了.比如,確認(rèn)號為X,則表示前X-1個數(shù)據(jù)段都收到了,只有當(dāng)ACK=1時,確認(rèn)號才有效,當(dāng)ACK=0時,確認(rèn)號無效,這時會要求重傳數(shù)據(jù),保證數(shù)據(jù)的完整性.
SYN 同步序列號,TCP建立連接時將這個位置1
FIN 發(fā)送端完成發(fā)送任務(wù)位,當(dāng)TCP完成數(shù)據(jù)傳輸需要斷開時,提出斷開連接的一方將這位置1
2、UDP
UDP(用戶數(shù)據(jù)報協(xié)議)是非連接的協(xié)議,傳輸數(shù)據(jù)之前源端和終端不建立連接,當(dāng)它想傳送時就簡單地去抓取來自應(yīng)用程序的數(shù)據(jù),并盡可能快地把它扔到網(wǎng)絡(luò)上。在發(fā)送端,UDP傳送數(shù)據(jù)的速度僅僅是受應(yīng)用程序生成數(shù)據(jù)的速度、計算機的能力和傳輸帶寬的限制;在接收端,UDP把每個消息段放在隊列中,應(yīng)用程序每次從隊列中讀一個消息段。
UDP的特點:
1)由于傳輸數(shù)據(jù)不建立連接,因此也就不需要維護連接狀態(tài),包括收發(fā)狀態(tài)等,因此一臺服務(wù)機可同時向多個客戶機傳輸相同的消息。
2) UDP信息包的標(biāo)題很短,只有8個字節(jié),相對于TCP的20個字節(jié)信息包的額外開銷很小。 3)吞吐量不受擁擠控制算法的調(diào)節(jié),只受應(yīng)用軟件生成數(shù)據(jù)的速率、傳輸帶寬、源端和終端主機性能的限制
4)UDP使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持復(fù)雜的鏈接狀態(tài)表(這里面有許多參數(shù))。
5)UDP是面向報文的。發(fā)送方的UDP對應(yīng)用程序交下來的報文,在添加首部后就向下交付給IP層。既不拆分,也不合并,而是保留這些報文的邊界,因此,應(yīng)用程序需要選擇合適的報文大小。
3、TCP和UDP的區(qū)別
1.基于連接與無連接; 2.對系統(tǒng)資源的要求(TCP較多,UDP少); 3.UDP程序結(jié)構(gòu)較簡單; 4.流模式與數(shù)據(jù)報模式 ;
5.TCP保證數(shù)據(jù)正確性,UDP可能丟包,TCP保證數(shù)據(jù)順序,UDP不保證。