XMPP的介紹:The Extensible Messaging and Presence Protocol(可擴展通訊和表示協議)拯勉。XMPP是一套即時通信協議谜诫,實現了注冊、登錄攀涵、聊天托启、好友、群聊等功能尖殃。XMPP是一種基于XML的協議丈莺,繼承XML環(huán)境中靈活的發(fā)展性。
工作原理:XMPP是一個典型的C/S架構(C/S<客戶端/服務器>服務器壓力大送丰、客戶端簡單;P/P<點對點>架構服務器壓力小缔俄,客戶端復雜,QQ就是P/P)蚪战。XMPP中定義了三個角色牵现,XMPP客戶端、XMPP服務器邀桑、網管瞎疼。通信能夠在三者的任意兩個之間雙向發(fā)生。
a) 節(jié)點連接到服務器壁畸;
b) 服務器利用本地目錄系統中的證書對其認證贼急;
c) 節(jié)點指定目標地址,讓服務器告知目標狀態(tài)捏萍;
d) 服務器查找太抓、連接并進行相互認證;
e) 節(jié)點之間進行交互令杈。
- XMPP傳輸過程:XMPP協議的傳輸是通過XML文件來傳輸的走敌,并且不是類似于QQ的點對點通訊,而是客戶端到服務器再到客戶端的方式來實現逗噩,以上過程的一個簡單的XMPP通訊流程可以如下:
a) 首先掉丽,由客戶端連接到服務器跌榔,客戶端通過IO流發(fā)送一段XML文件,在文件中包含了自身的用戶名和密碼
b) 服務器端接收到客戶端的XML文件捶障,從中獲取用戶名和密碼進行驗證僧须,如果驗證成功,服務器會發(fā)送一個XML文件給客戶端表明已經登錄成功
c) 登陸成功后项炼,客戶端可以通過發(fā)送一個獲取好友名單的XML文件担平,服務器會將當前用戶的好友以XML文件傳到客戶端
d) 客戶端選擇一個好友,向其發(fā)送信息(其實是向服務器發(fā)送锭部,服務器收到后會轉發(fā)給對應的好友)暂论,好友收到
- XMPP的三大節(jié)點:
a) XMPPPresence:出席(登錄、下線空免、隱身等)
b) XMPPMessage:消息
c) XMPPIQ:信息請求(info query)
XMPP環(huán)境配置:使用Openfire服務器(是開源的空另、基于可拓展通訊和表示協議(XMPP)、采用Java編程語言開發(fā)的實時協作服務器蹋砚。Openfire安裝和使用都非常簡單扼菠,并利用Web進行管理。單臺服務器可支持上萬并發(fā)用戶坝咐。)循榆,MySQL數據庫。服務器監(jiān)聽的端口一般是5222
蘋果XMPP開發(fā)框架:XMPPFramework是一個OS X/iOS平臺的開源項目墨坚,使用Objective-C實現了XMPP協議(RFC-3920)秧饮,同時還提供了用于讀寫XML的工具,大大簡化了基于XMPP的通信應用的開發(fā)泽篮。它的核心是由Core文件夾下的核心類庫和Extensions拓展類庫組成的盗尸,其中Core類庫負責應用跟服務器進行交互,拓展類庫Extension主要是以模塊的形式封裝即時通信的一些功能帽撑,如:好友列表泼各,聊天,群聊亏拉,自動連接等等扣蜻。
a) XMPPJID:就是我們用戶的賬號。全稱:用戶名@域名/資源及塘;非全稱:用戶名@域名莽使;資源:設備(iphone等)
b) XMPPStream:是用于跟服務器交互的XML流,也就是我們與后臺數據交互都是通過XMPPStream這個類的笙僚。后面的IQ,Message芳肌,Presence都可以看做是stream流的一種節(jié)點類型(節(jié)點就是xml格式當中類似于字典的鍵)
c) XMPPIQ:查詢節(jié)點(info Query),類似于HTTP請求,查詢請求都屬于這個類型亿笤。
d) XMPPMessage:消息節(jié)點檬嘀,發(fā)送的消息都屬于這個類型。
e) XMPPPresence(出席)责嚷,實際上就是登錄狀態(tài),隱身在線 繁忙等
f) XMPPElement:XML基本元素:節(jié)點
XMPP常用的模塊:心跳檢測(XMPPAutoPing)掂铐、重連(XMPPReconnect)罕拂、花名冊(XMPPRoster)、聊天記錄(XMPPMessageArchiving)全陨、文件收發(fā)爆班、頭像模塊、群聊辱姨,使用步驟1.生成模塊(創(chuàng)建柿菩,設置代理);2.配置模塊(配置參數);3.激活模塊。
各個功能的實現步驟
a) 登錄
i. 實例化XMPPStraem雨涛,設置IP和端口號枢舶、代理 XMPPStraem alloc]init] hostname,hostPort
ii. 流連接服務器:設置JID(用戶名、域名替久、資源名)凉泄,然后連接服務器,connect
iii. 連接服務器成功蚯根,驗證密碼:authenticate
iv. 驗證密碼成功后众,設置出席(上線):sendElement
b) 注冊功能:設置JID連接服務器成功后,注冊JID:registerWithPassword
c) 心跳檢測:實例化心跳檢測模塊對象颅拦;添加代理蒂誉;配置ping頻率和超時時間;指定激活stream流距帅。
d) 自動重連:實例化模塊右锨;配置是否自動重連和重連時間;激活锥债;
e) 好友列表:獲取單例好友存儲器陡蝇,根據存儲器實例化好友模塊對象,配置(接受好友添加哮肚、自動獲取好友)登夫,激活模塊。
i. 獲取好友列表使用NSFetchedResultsController
創(chuàng)建查詢請求:NSFetchRequest允趟,實體“XMPPUserCoreDataStorageObject“
設置排序恼策、設置謂詞(subscription == 'both‘)
-
初始化NSFetchedResultsController
ii. 獲取群列表
向服務器發(fā)送一個獲取群列表IQ請求
在代理方法中得到iq響應
遍歷數組
f) 聊天記錄
g) 文件發(fā)送:實例文件模塊、配置、激活
i. 將圖片轉換成二進制
ii. 寫入沙盒涣楷,獲取路徑
iii. 發(fā)送[kHMXMPPManager.xmppOutgoingFileTransfer sendData:imgData named:name
iv. 添加subject用于識別圖片:message addSubject:@“IMAGE”;
v. 接收到文件在代理中《xmppIncomingFileTransfer》分唾,實現獲取沙盒路徑寫入文件。
h) 群聊功能:群聊結構分三層狮斗,openfire服務器绽乔,群聊服務器,群聊服務器的房間
i. 一般使用一個單例管理類來管理群聊功能碳褒。
ii. 實現加入到房間方法:從字典緩存判斷房間是否存在折砸,不存在創(chuàng)建,激活沙峻,加入緩存睦授,然后加入。
- 融云SDK介紹:特點是無需改變現有App的架構摔寨,直接嵌入現有代碼框架中去枷,無需改變現有服務器架構,直接部署一份用于用戶授權的服務器即可是复,集成簡單