前言
相信移動端開發(fā)的同學(xué),或多或少都了解或者開發(fā)過及時通訊類或者有及時通訊功能的項目,目前獨立開發(fā)來說比較常用的是基于socket,多數(shù)情況的快速開發(fā)都會選擇集成第三方的IM庫,如融云,環(huán)信等等,下面我要給大家介紹另一種IM的實現(xiàn)方式,基于xmpp協(xié)議,服務(wù)器采用openfire,客戶端使用開源的XMPPFramework的方式實現(xiàn)即時通信
知識背景
XMPP相關(guān)
1. 什么是XMPP ?
XMPP的前身是Jabber,一個開源形式組織產(chǎn)生的網(wǎng)絡(luò)即時通信協(xié)議。XMPP目前被IETF國際標(biāo)準(zhǔn)組織完成了標(biāo)準(zhǔn)化工作。標(biāo)準(zhǔn)化的核心結(jié)果分為兩部分; 核心的XML流傳輸協(xié)議 基于XML流傳輸?shù)募磿r通訊擴展應(yīng)用 XMPP的核心XML流傳輸協(xié)議的定義使得XMPP能夠在一個比以往網(wǎng)絡(luò)通信協(xié)議更規(guī)范的平臺上。借助于XML易于解析和閱讀的特性,使得XMPP的協(xié)議能夠非常漂亮。
2. XMPP的基本網(wǎng)絡(luò)結(jié)構(gòu)是怎樣的?
XMPP中定義了三個角色,客戶端,服務(wù)器,網(wǎng)關(guān)。通信能夠在這三者的任意兩個之間雙向發(fā)生。服務(wù)器同時承擔(dān)了客戶端信息記錄,連接管理和信息的路由功能?;镜木W(wǎng)絡(luò)形式是單客戶端通過TCP/IP連接到單服務(wù)器,然后在之上傳輸XML。
3. XMPP通過TCP傳什么了?
傳輸?shù)氖桥c即時通訊相關(guān)的指令。在以前這些命令要么用2進制的形式發(fā)送(比如QQ),要么用純文本指令加空格加參數(shù)加換行苻的方式發(fā)送(比如MSN)。而XMPP傳輸?shù)募磿r通訊指令的邏輯與以往相仿,只是協(xié)議的形式變成了XML格式的純文本。這不但使得解析容易了,人也容易閱讀了,方便了開發(fā)和查錯。而XMPP的核心部分就是一個在網(wǎng)絡(luò)上分片斷發(fā)送XML的流協(xié)議。這個流協(xié)議是XMPP的即時通訊指令的傳遞基礎(chǔ),也是一個非常重要的可以被進一步利用的網(wǎng)絡(luò)基礎(chǔ)協(xié)議。所以可以說,XMPP用TCP傳的是XML流。
4.XMPP協(xié)議工作原理
所有從一個client到另一個client的消息和數(shù)據(jù)都要通過xmpp server
1.client連接到server
2.server利用被頂目錄系統(tǒng)的證書對其認(rèn)證
3.client指定目標(biāo)地址,讓server告知目標(biāo)狀態(tài)
4.server查找,連接并進行互相認(rèn)證
5.client間進行交互
5. XMPP協(xié)議地址格式
統(tǒng)一的JID(jabber identifier)
JID = name@domain/resource
其中name為用戶名,domain為服務(wù)器名稱,resource屬于用戶的位置或設(shè)備
例如: zhengzhijian@127.0.0.1/iphone
6. XMPP消息格式:

presence:元素確定用戶的狀態(tài)
message:用于兩個用戶之間發(fā)送的信息
iq:信息/請求,是一個請求-響應(yīng)機制,管理xmpp服務(wù)器上兩個用戶的轉(zhuǎn)換,允許他們通過響應(yīng)的xml格式的查詢和響應(yīng)
7. XMPP系統(tǒng)特點:
(1)客戶機/服務(wù)器通信模式
(2)分布式網(wǎng)絡(luò)
(3)簡單的客戶端
(4)XML的數(shù)據(jù)格式
8、 xmpp 協(xié)議缺點
數(shù)據(jù)負(fù)載太重:隨著通常超過 70%的 XMPP 協(xié)議的服務(wù)器的數(shù)據(jù)流量的存在和近60%的被重復(fù)轉(zhuǎn)發(fā),XML的數(shù)據(jù)格式,相對較重
沒有二進制數(shù)據(jù): XMPP 協(xié)議的方式被編碼為一個單一的長的 XML 文件,因此無法提供修改二進制數(shù)據(jù)。因此, 文件傳輸協(xié)議一樣使用外部的 HTTP。
openfire相關(guān)
1.什么是openfire
您可以使用它輕易的構(gòu)建高效率的即時通信服務(wù)器.
openfire安裝和使用都非常簡單,并利用Web進行管理。單臺服務(wù)器可支持上萬并發(fā)用戶。
由于是采用開放的XMPP協(xié)議,您可以使用各種支持XMPP協(xié)議的IM客戶端軟件登陸服務(wù).
環(huán)境配置
配置openfire
1.首先官網(wǎng)下載openfire openfire官網(wǎng),并根據(jù)自己的計算機系統(tǒng)進行下載

例如我是macos,安裝好后再系統(tǒng)偏好設(shè)置中,開啟openfire服務(wù)器并進行配置


如果macos下不能正常開啟,可以嘗試用命令行開啟(我就是因為點擊開啟,偏好設(shè)置直接崩潰,所以嘗試的命令行開啟),開啟的前提是本機需要安裝java環(huán)境,注意自己本機的java環(huán)境的版本
java環(huán)境配置教程
用命令行的方式開啟openfire
1. sudo chmod -R 777 /usr/local/openfire/bin 來取得文件夾權(quán)限
a:sudo su
b: cd /usr/local/openfire/bin
c:export JAVA_HOME=`/usr/libexec/java_home`
d:echo $JAVA_HOME /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home
e: cd /usr/local/openfire/bin
f: ./openfire.sh

如果還有openfire啟動問題可參考openfire配置常見問題
2.配置openfire服務(wù)器
如果openfire開啟成功,可以在偏好設(shè)置中進行配置
-
2.1配置語言
image.png -
2.2配置為127.0.0.1即可
image.png -
2.3配置數(shù)據(jù)庫
image.png

驗證本地是否有簡歷的openfire數(shù)據(jù)庫,可以執(zhí)行以下命令
注:Mac安裝mysq,里面有更為詳盡的配置
alias mysql=/usr/local/mysql/bin/mysql //輸入alias命令
mysql -u root -p //連接數(shù)據(jù)庫,之后要輸入root的密碼
show databases; //查詢已創(chuàng)建的數(shù)據(jù)庫(將進入了mysql下,命令有分號)

-
2.4設(shè)置管理員郵箱和登錄密碼即可
image.png -
2.5登錄openfire管理后臺即可,默認(rèn)的用戶名admin,密碼為上一步中設(shè)置的密碼
image.png -
2.5登錄成功進入后臺,如下圖
image.png -
2.6我們嘗試創(chuàng)建一個用戶,并且使用openfire官網(wǎng)提供的spark進行登錄,看看是否可以正常登錄,如圖我們創(chuàng)建了一個iOScoderZZJ的用戶,spark也可以再openfire官網(wǎng)下載
image.png
image.png
-
2.7登錄驗證下是否配置成功,在spark上進行登錄,驗證流程是否全部正確,如果登錄的時候有證書驗證的問題,可以參考文章Spark 連接證書失效解決方法
image.png -
2.8登錄成功后,并且刷新openfire后臺
image.png
image.png 2.9卸載openfire
sudo rm -rf /Library/PreferencePanes/Openfire.prefPanesudo
sudo rm -rf /usr/local/openfiresudo
sudo rm -rf /Library/LaunchDaemons/org.jivesoftware.openfire.plist
xmppframework大致連接流程

sdk相關(guān)
安卓smack
iOS XMPPFramework










