XMPP
一、 實現(xiàn)原理
? ? ?XMPP是一個即時通訊的協(xié)議,是建立在Socket通信基礎上的,它規(guī)范了用于即時通信在網(wǎng)絡上數(shù)據(jù)傳輸格式的。XMPP在網(wǎng)絡傳輸?shù)臄?shù)據(jù)是XML格式
? ? ?XMPP是一個基于XML的網(wǎng)絡協(xié)議,目的是為了保存長連接,以實現(xiàn)即時通訊功能
? ? ?XMPP是一個典型的C/S架構(C1與C2之間發(fā)送的消息每次都通過服務器來中轉),基本的網(wǎng)絡形式是客戶端通過TCP/IP連接到服務器,通過Socket建立連接,然后在之上傳輸XML流
? ? ?XMPP的客戶端是使用一個XMPPFramework框架實現(xiàn)
? ? ?XMPP的服務器是使用Openfire,一個開源的服務器
? ? 客戶端獲取到服務器發(fā)送過來的好友消息,客戶端需要對XML進行解析,使用的解析框架的KissXML框架,而不是NSXMLParser/GDataXML
二、 XMPP工作原理
? ? 客戶端之間的消息和數(shù)據(jù)交流都要通過XMPP服務器
? ? ? ?a、客戶端連接到服務器
? ? ? ?b、服務器根據(jù)本地目錄系統(tǒng)的證書對客戶端進行認證
? ? ? ?c、認證通過后,客戶端制定連接對象的地址,讓服務器告訴客戶端目標狀態(tài)
? ? ? ?d、服務器查找、連接并進行相互認證
? ? ? ?e、客戶端之間就可以進行交互
XMPP_XML消息格式
? ? ? ?a、表示用戶狀態(tài)
? ? ? ?b、用戶之間發(fā)送的消息
? ? ? ?c、用戶請求信息(client在stream的上下文中插入一個元素,向Server請求得到自己的好友列表,Server返回一個里面是請求的結果)
困難點
? ? 1、發(fā)送附件(圖片,語音,文檔…)時比較麻煩
? ? 2、XMPP框架沒有提供發(fā)送附件的功能,需要自己實現(xiàn)
? ? 3、實現(xiàn)方法,把文件上傳到文件服務器,上傳成功后獲取文件保存路徑,再把附件的路徑發(fā)送給好友
三、 環(huán)信
環(huán)信是一個即時通信的服務提供商
環(huán)信使用的是XMPP協(xié)議,它是再XMPP的基礎上進行二次開發(fā),對服務器Openfire和客戶端進行功能模型的添加和客戶端SDK的封裝,環(huán)信的本質還是使用XMPP,基本于Socket的網(wǎng)絡通信
環(huán)信內部實現(xiàn)了數(shù)據(jù)緩存,會把聊天記錄添加到數(shù)據(jù)庫,把附件(如音頻文件,圖片文件)下載到本地,使程序員更多時間是花到用戶即時體驗上
環(huán)信內部已經(jīng)實現(xiàn)了視頻,音頻,圖片,其它附件發(fā)送功能
環(huán)信使用公司可以節(jié)約時間成本
不需要公司內部搭建服務器
客戶端的開發(fā),使用環(huán)信SDK比使用XMPPFramework更簡潔方便
通信過程
在線狀態(tài):A發(fā)送消息到環(huán)信服務器,環(huán)信服務器推送消息到B.
離線狀態(tài):A發(fā)送消息到環(huán)信服務器,環(huán)信服務器檢測到B不在線,會添加到離線緩存中,當B登陸后服務器會把離線消息推送給B
環(huán)信聊天記錄存儲
A發(fā)送消息到環(huán)信服務器的同時,SDK會保存這條消息到本地數(shù)據(jù)庫(SDK內部創(chuàng)建數(shù)據(jù)庫,不允許直接操作)中,環(huán)信服務器在推送消息到B的同時也會在服務器記錄下來(消息歷史記錄只會保留14天),B收到消息后,SDK會將這條消息存儲到本地數(shù)據(jù)庫
注意:客戶端并未提供去服務器獲取聊天記錄的接口,所以,如果換了設備或者清空了數(shù)據(jù),聊天記錄都不會存在,如果有需求要從服務器拉去聊天記錄,可以在自己服務器處理