不好意思,內(nèi)附一些swift的東西地址:https://github.com/tanzhiwen/SwiftTips
XMPP詳解(http://www.cnblogs.com/jiyuqi/tag/xmpp/)
XMPP(eXtensible Messaging and Presence Protocol,可擴(kuò)展消息處理和現(xiàn)場協(xié)議)是一種在兩個地點(diǎn)間傳遞小型結(jié)構(gòu)化數(shù)據(jù)的協(xié)議。在此基礎(chǔ)上,XMPP協(xié)議已經(jīng)被用來構(gòu)建大規(guī)模即時通信系統(tǒng)、游戲平臺、協(xié)作空間及語音和視頻會議系統(tǒng)。
XMPP由幾個小的構(gòu)造塊組成,并在此基礎(chǔ)上擴(kuò)展出了更多的構(gòu)造塊。XMPP中有眾多系統(tǒng):發(fā)布-訂閱服務(wù)、多人聊天、表單檢索與處理、服務(wù)發(fā)現(xiàn)、實(shí)時數(shù)據(jù)傳輸、隱私處理及遠(yuǎn)程過程調(diào)用等。
大多數(shù)社交媒體(Facebook及Twitter)也采用了XMPP協(xié)議。
什么是XMPP
與其他協(xié)議一樣,XMPP定義了在兩個或者更多通信實(shí)體間傳遞數(shù)據(jù)所采用的格式。對于XMPP,實(shí)體通常是指客戶端服務(wù)器,但是其也允許客戶端與客戶端或服務(wù)器端與服務(wù)器端的通信。
在XMPP上交換的是XML數(shù)據(jù),采用這種格式,使XMPP協(xié)議獲得了極大的可擴(kuò)展性,因?yàn)槭褂肵ML可以方便的新增功能并保證前后向兼容。使用XML較二進(jìn)制協(xié)議占用更大的帶寬,但獲得的優(yōu)勢是具有了幾乎無限的可擴(kuò)展性。
用戶可以向XMPP Standards Foundation注冊協(xié)議擴(kuò)展。
在XMPP中,XML數(shù)據(jù)被組織為了一對流,每個流分別對應(yīng)通信的一個方向。每個XML流均由一個開始元素、后跟XMPP節(jié)和其他頂級元素,然后是一個結(jié)束元素組成。每個XMPP節(jié)(可帶有子元素及屬性)均是該流的一級子元素。在XMPP連接末尾,這兩個流形成了一對有效的XMPP文檔。
XMPP節(jié)構(gòu)成了該協(xié)議的核心部分,而XMPP應(yīng)用程序則關(guān)注如何發(fā)送和響應(yīng)各種類型的節(jié)。節(jié)可能包含網(wǎng)絡(luò)上其他實(shí)體的信息、類似于電子郵件的個人消息或?yàn)橛?jì)算機(jī)處理而設(shè)計(jì)的結(jié)構(gòu)化數(shù)據(jù)。what think you of books在一個典型的XMPP會話中,一個上述的節(jié)將會從darcy的XMPP客戶端發(fā)送到她的XMPP服務(wù)器,她的服務(wù)器將會注意到該節(jié)的目的地是某個遠(yuǎn)程服務(wù)器上的一個實(shí)體,因此與該遠(yuǎn)程服務(wù)器先建立XMPP連接,并將消息轉(zhuǎn)發(fā)該處。
這種通信網(wǎng)絡(luò)與電子郵件類似,但與電子郵件服務(wù)器不同的是,XMPP間的服務(wù)器可以直接通信,而不需要借助中間服務(wù)器。
這種直接通信避免了垃圾信息的干擾,且還支持通過TLS(Transport Layer Security,傳輸層安全)來加密通信并通過SASL(Simple Authentication and Security Layers,簡單身份驗(yàn)證與安全層)實(shí)現(xiàn)身份驗(yàn)證機(jī)制。
XMPP使用傳遞短小信息來設(shè)計(jì)的,而非針對大型數(shù)據(jù)塊,但XMPP能夠用來協(xié)商并建立可在端點(diǎn)間傳遞大型數(shù)據(jù)塊的帶內(nèi)或者帶外傳輸。
XMPP網(wǎng)絡(luò)
任何XMPP網(wǎng)絡(luò)都是由若干角色組成,可以分為服務(wù)器端、客戶端、組件和服務(wù)器插件。
XMPP網(wǎng)絡(luò)與WWW網(wǎng)絡(luò)及EMAIL網(wǎng)絡(luò)不同,XMPP服務(wù)器之間尋址只會跳一次,而EMAIL協(xié)議則會有多個中轉(zhuǎn)服務(wù)器,XMPP保存完整的列表。
服務(wù)器
XMPP服務(wù)器是任何XMPP網(wǎng)絡(luò)的通信系統(tǒng),服務(wù)器的任務(wù)就是為XMPP節(jié)提供路由。無論這些節(jié)是從內(nèi)部的一個用戶發(fā)往另外一個用戶還是本地用戶發(fā)送給服務(wù)器。
一組能夠相互通信的XMPP服務(wù)器構(gòu)成了XMPP網(wǎng)絡(luò)。
XMPP服務(wù)器總是允許用戶連接到自己,但是也可以編寫直接使用服務(wù)器-服務(wù)器協(xié)議的應(yīng)用和程序,來減輕路由消耗
Ejabberd、Openfire和Tigase是三種能夠運(yùn)行在Windows,Mac OS X和Linux的開源服務(wù)器。
M-Link和Jabber XCP是商用產(chǎn)品。
客戶端
大多數(shù)XMPP實(shí)體均是客戶端,通過客戶端-服務(wù)器協(xié)議連接到XMPP服務(wù)器。
客戶端必須向某個地方的XMPP服務(wù)器進(jìn)行身份驗(yàn)證。服務(wù)器會將該客戶端發(fā)送的所有節(jié)路由到合適的目的地。
服務(wù)器還負(fù)責(zé)管理客戶端會話的其他幾個方面,包括花名冊及裸地址。
組件
不僅僅是客戶端能夠連接到XMPP服務(wù)器,大多數(shù)服務(wù)器還支持外部服務(wù)器組件。這些組件通過添加某種新服務(wù)來增強(qiáng)服務(wù)器的行為。這些組件在服務(wù)器內(nèi)有各自的身份和地址,但運(yùn)行在外部并通過組件協(xié)議通信。
組件協(xié)議(XEP-0114)可以讓開發(fā)人員以一種服務(wù)器不可知的方式創(chuàng)建服務(wù)器擴(kuò)展,例如多人聊天服務(wù)。
組件也需要向XMPP服務(wù)器進(jìn)行身份驗(yàn)證,但要較客戶端的完全SASL驗(yàn)證簡單,例如口令。
每個組件編程服務(wù)器內(nèi)部一個可單獨(dú)尋址的實(shí)體,在外界看類似于一個子服務(wù)器。除了基本節(jié)之外,XMPP服務(wù)器不會代替已連接組件來管理其他節(jié)的路由。
服務(wù)器還允許組件在內(nèi)部自行路由或管理節(jié),因而更為靈活。
插件
許多XMPP服務(wù)器還支持使用插件進(jìn)行擴(kuò)展,但插件深入到服務(wù)器內(nèi)部,有較高的效率以及最低的通用性。
插件一般是綁定特定類型的服務(wù)器的。
XMPP尋址
XMPP網(wǎng)絡(luò)上的每個實(shí)體都有一個或多個地址(稱為JID,jabber identifier)。通常類似于:
darcy@pemberley.lit和elizabeth@longbourn.lit就是兩個JID。
JID由三個部分組成,節(jié)點(diǎn)、域和資源,域是必須的,其他兩個部分是可選的。
域是實(shí)體(服務(wù)器、組件或插件)可解析的DNS名稱。僅由域組成的JID是有效地址,表示服務(wù)器地址。指向域的節(jié)將由服務(wù)器自身處理,并可能被路由到某個組件或插件。
本地部分通常用來識別域中的一個特定用戶,位于@前。本地部分也可以用來識別其他對象,如某個聊天室。
JID的資源部分通常會標(biāo)識一個特定客戶端的XMPP連接。對于XMPP客戶端而言,每個連接均被指派一個資源。如darcy@perberley.lit想要連接他的書法和圖書館則可以通過
darcy@perberley.lit/study和darcy@perberley.lit/library來尋址,這樣避免了用戶在打開多個鏈接時消息無法找到正確的處理器。主要注意的是,資源部分是區(qū)分大小寫的。
JID劃分為兩種類型:
?? 裸JID
完整JID去除資源部分的地址,客戶端的裸JID有些特殊,這是因?yàn)榉?wù)器自己將處理發(fā)往客戶端的裸JID節(jié)。裸JID可以視為尋址用戶的賬戶,而不是客戶端。
?? 完整JID
最為具體的地址
XMPP節(jié)核心XMPP工具集由三個基本節(jié)組成,分別為、和XMPP流由兩份XML文檔組成,通信的每個方向均有一個文檔,這些文檔有一個根元素,的子元素由可路由的節(jié)以及與流相關(guān)的頂級子元素構(gòu)成。復(fù)制代碼//請求自己的花名冊//通知服務(wù)器她已在線并可以訪問I cannot talk of books in a ball-room; my head is always full of something else.
//發(fā)送消息// 聲明自己不可訪問并關(guān)閉復(fù)制代碼通用屬性from/to/type/idfrom的屬性并非由客戶端提供,而是服務(wù)端進(jìn)行的標(biāo)記。presence節(jié)presence提供網(wǎng)絡(luò)實(shí)體的可訪問性。用戶發(fā)出presence節(jié),表明自己上線,這樣可以會有更大的概率與別人通信(人們更愿意與在線的人交流),但是我們也不用擔(dān)心任何人都可以看到自己的在線狀態(tài),除非我們訂閱了該用戶的狀態(tài),訂閱之后,用戶的狀態(tài)信息會自動發(fā)送到訂閱者處。實(shí)際上,XMPP的presence節(jié)是一個簡單的專用的發(fā)布-訂閱方法。在IM中,presence體現(xiàn)在花名冊(roster)中,花名冊保存有JID列表以及用戶與這些JID的訂閱關(guān)系,一旦上線,用戶發(fā)送presence節(jié),剩下的就由服務(wù)器處理了(通知自己在線,以及獲取聯(lián)系人的狀態(tài)信息)message節(jié)用于從一個實(shí)體向另外一個實(shí)體發(fā)送消息,并可以傳輸任何類型的結(jié)構(gòu)化信息,不保證傳輸可靠性message是一個非常基礎(chǔ)的推模型,message通常用于IM,groupchat,警告和通知等。message的type有如下幾種:normal 類似于email,發(fā)出后不等待回應(yīng)chat 用于兩個實(shí)體間的實(shí)時通信groupchat 多用戶聊天室中使用headline 用于發(fā)送警告或通知error發(fā)送錯誤信息Who are you?Query除了type之外,典型的message節(jié)中還包含from、to或者id屬性(用于目的追蹤)。to中的JID為消息的接受者,from是發(fā)送者的JID,但是from屬性并非由客戶端提供,而是發(fā)送者的服務(wù)端提供的,以避免地址模仿。message節(jié)中也可以包含未在XMPP協(xié)議中定義的負(fù)載,可以用于擴(kuò)展。IQ節(jié)表示Info/Query,為XMPP通信提供請求及響應(yīng)機(jī)制,類似于GET/POST/PUT方法。IQ只能包含一個payload,并且定義了需要由服務(wù)器處理的請求或者動作。相對于message來說,IQ具有更好的可靠性,因其要求收到回應(yīng)。IQ中包含有id屬性,用于識別服務(wù)器發(fā)回的響應(yīng)。get 用于請求信息,類似于HTTP Getset 提供信息或請求,類似于HTTP POST/PUTresult 響應(yīng)請求,類似于HTTP 200error 錯誤信息例子發(fā)送獲取花名冊請求服務(wù)器返回花名冊復(fù)制代碼復(fù)制代碼用戶新增一個聯(lián)系人服務(wù)器響應(yīng)error節(jié)具有明確的結(jié)構(gòu),通常包含原節(jié)內(nèi)容,通用錯誤信息以及應(yīng)用程序特有的錯誤條件和信息(可選)可擴(kuò)展XMPP協(xié)議是基于XML的協(xié)議,因此其天生提供了很好的可擴(kuò)展性。我們可以用XMPP傳遞各種信息,包括鏈接、位置信息,Web Service等。連接生命周期發(fā)送XMPP節(jié)通常需要建立一個經(jīng)過身份驗(yàn)證的XMPP會話,包括連接、流的建立、身份驗(yàn)證以及斷開連接。連接在發(fā)送任何節(jié)之前,需要建立XMPP流,在XMPP流存在之前,必須建立通往XMPP服務(wù)器的連接。當(dāng)XMPP客戶端或者服務(wù)器連接到另外一個XMPP服務(wù)器時,首先要查詢SRV記錄,該記錄保存有特定域的服務(wù)器列表。查詢應(yīng)答中可以包含多條SRV記錄,這樣就可以在多個服務(wù)器中建立負(fù)載均衡連接。如果沒有找到合適的SRV記錄,那么程序?qū)⒃噲D直接連接到指定域。流的建立?? 一旦建立通過給定XMPP服務(wù)器的連接,XMPP流就啟動了?? 向服務(wù)器發(fā)送,就可以打開XMPP流,服務(wù)器發(fā)送響應(yīng)流的起始標(biāo)記進(jìn)行響應(yīng)建立XMPP流之后就可以來回發(fā)送各種元素?? 服務(wù)器發(fā)送元素,列舉XMPP流中支持所有功能,大多數(shù)與可用的加密和身份驗(yàn)證選型有關(guān)身份驗(yàn)證XMPP允許進(jìn)行TLS(Transport Layer Security,傳輸層安全)加密,而且大多數(shù)客戶端默認(rèn)使用該功能。一旦服務(wù)器通告TLS支持后,客戶端就會啟動TLS連接并將當(dāng)前套接字升級為加密套接字而不斷開連接。一旦TLS加密確立,就會創(chuàng)建一對新的XMPP流。XMPP中的身份驗(yàn)證使用SASL(Simple Authentication and Security Layers,簡單身份驗(yàn)證與安全層)協(xié)議并支持多種身份驗(yàn)證機(jī)制(取決于服務(wù)器)。一旦完成身份驗(yàn)證,客戶端必須為連接綁定一個資源并啟動一個會話,通過和元素發(fā)送。當(dāng)兩臺服務(wù)器相互連接時,身份驗(yàn)證步驟稍稍不同。連接斷開當(dāng)用戶結(jié)束XMPP會話后,他們終止會話并斷開連接,最優(yōu)雅的方式是首先發(fā)送無效出席信息,然后關(guān)閉元素。