iOS 開發 XMPP即時通訊項目開發(仿微信)-詳解之XMPP入門


iOS 開發 XMPP即時通訊項目開發(仿微信)-詳解之XMPP入門

1.即時通信(Instant Message /IM)的含義

即時通信軟件發展

產品最早的創始人是三個以色列青年,是他們在1996年做出來的,取名叫ICQ。

1998年當ICQ註冊用戶數達到1200萬時,被AOL看中,以2.87億美元的天價買走。ICQ有1億多用戶,主要市場在美洲和歐洲,已成爲世界上最大的即時通信系統。

即時通訊技術(IM – Instant Messaging)支持用戶在線實時交談。如果要發送一條信息,用戶需要打開一個小窗口,以便讓用戶及其朋友在其中輸入信息並讓交談雙方都看到交談的內容

有許多的IM系統,如AOL、Yahoo IM、 MSN以及QQ,它們最大的區別在於各自通訊協議的實現,所以即時通訊技術的核心在於它的傳輸協議

協議用來說明信息在網絡上如何傳輸,如果有了統一的傳輸協議,那麼應當可以實現各個IM之間的直接通訊,爲了創建即時通訊的統一標準,目前已經出現過的IM協議包括:IETF的對話初始協議(SIP)和即時通訊對話初始協議和表示擴展協議(SIMPLE)、應用交換協議(APEX)、顯示和即時通訊協議(PRIM)及基於XML且開放的可擴展通訊和表示協議(XMPP)協議(常稱爲 Jabber 協議)

人們多次努力,試圖統一各大主要IM供應商的標準(AOL、Yahoo 及 Microsoft),但無一成功,且每一種IM仍然繼續使用自己所擁有的協議

XMPP起源

XMPP是基於XML的協議,用於即時消息(IM)以及在線現場探測。最初,XMPP作爲一個框架開發,目標是支持企業環境內的即時消息傳遞和聯機狀態應用程序。 XMPP前身是Jabber(1998年),是一個開源組織定義的網絡即時通信協議

XMPP是一個分散型通信網絡,這意味着,只要網絡基礎設施允許,任何XMPP用戶都可以向其他任何XMPP用戶傳遞消息。多個XMPP服務器也可以通過一個專門的“服務器-服務器”協議相互通信,提供了創建分散型社交網絡和協作框架的可能性

儘管XMPP的出現是爲了滿足“個人-個人”即時消息傳遞的要求,但它完全不必侷限於此任務 XMPP概述 XMPP是一種基於XML的協議,它繼承了在XML環境中靈活的發展性。這表明XMPP是可擴展的。可以通過發送擴展的信息來處理用戶的需求,以及在 XMPP的頂端建立如內容發佈系統和基於地址的服務等應用程序。而且,XMPP包含了針對服務器端的軟件協議,使之能與另一個進行通話,這使得開發者更容易建立客戶應用程序或給一個配置好的系統添加功能 XMPP的核心XML流傳輸協議的定義使得XMPP能夠在一個比以往網絡通信協議更規範的平臺上。藉助於XML易於解析和閱讀的特性,使得XMPP的協議能夠非常漂亮 XMPP的即時通訊擴展應用部分是根據IETF在這之前對即時通訊的一個抽象定義的,與其他業已得到廣泛使用的即時通訊協議,諸如AIM,QQ等有功能完整,完善等先進性 XMPP的擴展協議Jingle使得其支持語音和視頻,目前iOS尚不支持 XMPP的官方文檔是RFC 3920 XMPP協議曾經是Google力推的即時通信協議,其代表作品是GTalk

XMPP定義

XMPP:The Extensible Messaging and Presence Protocol(可擴展通訊和表示協議)

XMPP可用於服務類實時通訊、表示和需求響應服務中的XML數據元流式傳輸。XMPP以Jabber協議爲基礎,而Jabber是即時通訊中常用的開放式協議

XMPP是基於XML的協議,用於即時消息(IM)以及在線現場探測。促進服務器之間的準即時操作。這個協議可能最終允許因特網用戶向因特網上的其他任何人發送即時消息,即使其操作系統和瀏覽器不同 

XMPP工作原理

節點連接到服務器 服務器利用本地目錄系統中的證書對其認證 節點指定目標地址,讓服務器告知目標狀態 服務器查找、連接並進行相互認證 節點之間進行交互

QQ,MSN,GoogleTalk,AIM,Jabber(XMPP別名),百度hi,網易泡泡,盛大圈圈,淘寶旺旺,易信,iChat等等。 QQ的前身OICQ在1999年2月第一次推出,幾乎接近壟斷中國在線即時通訊軟件市場。 百度Hi具備文字消息、音視頻通話、文件傳輸等功能,您可通過它找到志同道合的朋友,並隨時與好友聯絡感情; 另一類是企業用IM,簡稱EIM,如:E話通,UC,EC企業即時通信軟件,UcSTAR、商務通等

即時通信中除了基本信息,特殊指令如何傳輸?

即時通訊相關的指令。在以前這些命令要麼用2進制的形式發送(比如QQ),要麼用純文本指令加空格加參數加換行符的方式發送(比如MSN)。而XMPP傳輸的即時通訊指令的邏輯與以往相仿,只是協議的形式變成了XML格式的純文本。

2.XMPP入門

  • XMPP :Extensible Messaging and Presence Protocol,以Jabber協議(XMPP協議前身)爲基礎 XMPP協議基於可擴展標記語言XML,建立TPC/IP連接,完成C/S、C/C、S/S之間的數據傳輸。XMPP是一個消息傳輸國際化標準協議。 XMPP官網:http://xmpp.org XMPP官方中文wiki:Jabber/XMPP中文翻譯計劃

四個概念

  • XMPP服務器(不需要我們自己寫) 
    XMPP客戶端(iOS Android win) 
    XMPP協議 
    XMPPFramework(三方框架)

  • 經典服務器端Openfire

OpenFire是由JiveSoftware推出的一款經典XMPP Server,用Java編寫,並且開源。OpenFire由XMPPServer+JavaWebServer(嵌入式jetty容器)組成,前者基於XMPP協議進行通信,後者是一個Web管理後臺(HTTP/HTTPS). Openfire基於MINA框架,MINA框架是Java體系中目前應用非常廣泛的一個通信框架。 MINA基於NIO,前身是Netty2,Netty2的架構不是很好,由Trustin Lee在2004年重寫並改名爲MINA。 NIO自Java 1.4之後加入JDK中,其核心內容便是非阻塞的,高性能的底層IO。換言之JDK 4之前的IO阻塞問題需要開發者自行解決。 
Openfire的數據庫選擇

  • OpenFire是server端,因此數據庫一般來說用C/S型DBMS比較好(SQLServer,MySQL,Oracle等),爲了良好的併發性能,基本上不考慮SQLite這種嵌入式數據庫(OpenFire的實現中也沒有這個選項)。

  • 外接數據庫:如果OpenFire使用的數據庫是獨立的數據庫服務器,那麼這個配置過程叫做數據庫外接,數據庫外接可以讓Openfire的數據庫表寫入一個已經存在的數據庫中,方便我們做數據同步。

  • 內置數據庫:偶爾也會使用Openfire內置的數據庫(PostgreSQL),Openfire稱之爲嵌入式數據庫,但是不代表PostgreSQL是一款像SQLite的嵌入式數據庫,PostgreSQL仍然是一款C/S架構的DBMS,只不過Openfire將其源碼附加在自己的安裝包中可以直接使用而已。

Openfire的安裝

如果需要卸載MySQL,先停止MySQL服務在執行清理腳本,否則會出現問題

  • 先準備好數據庫,如果是外接數據庫,需要先在對應的數據庫中準備好相應的Schema,例如:
 CREATE SCHEMA HMOpenFire;
 CREATE DATABASE HMOpenFire;
  • 1
  • 2
  • 1
  • 2
  • 在MySQL中以上兩句SQL效果一樣。

  • 如果使用的是MySQL數據庫,提前配置好schema的字符集爲UTF8,因爲MySQL的默認字符集是拉丁文,如果稍微不注意可能以後不方便保存中文。

  • 安裝好Openfire

  • 安裝好之後,訪問localhost:9090 配置本地域,管理員賬戶,端口等一些簡單配置。這些配置都可以通過XML配置文件修改。

  • 配置正確的數據庫連接URL java中的數據庫連接爲jdbc,java中直接連接數據庫與jdbc-odbc橋有所不同,jdbc不需要配置數據源,只需要加載對應數據庫的jdbc驅動即可。這些驅動已經附加在openfire安裝包中,我們只需要選擇即可。 而URL需要自己配置,例如mysql的數據庫連接url爲: jdbc:mysql://host:port/dbname?key1=value1&key2=value2…. 常見參數:(openfire有單獨處理用戶名和密碼,不必寫入url)

user 用戶名
password 密碼
autoReconnect 聯機失敗,是否重新聯機(true/false)
maxReconnect 嘗試重新聯機次數
initialTimeout 嘗試重新聯機間隔
maxRows 傳回最大行數
useUnicode 是否使用Unicode字體編碼(true/false)
characterEncoding 何種編碼(GB2312/UTF-8/…)
relaxAutocommit 是否自動提交(true/false)
capitalizeTypeNames 數據定義的名稱以大寫表示
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 結束openfire的配置,進入對應的數據庫schema,檢查openfire的系統表是否建表成功,以及初始數據是否插入成功,如果沒問題就可以開始使用。- 

使用 信息App 或者 Spark 等嘗試登陸我們的OpenFire服務器進行聊天

  1. 由於MacOS自帶的信息App支持Jabber協議,比較方便我們測試服務器的功能是否正常。當然JiveSoftware提供的Spark也能登陸我們的服務器,只不過這個軟件需要相應的JAVA環境纔可以運行(JDK)。

  2. 登陸時,如果本地域可以被正確解析爲server的IP地址,那麼無需單獨配置IP。反之需要填寫IP地址。默認的端口爲5222

  3. 登陸完成後,進入9090後臺,查看會話列表,觀察我們的上下線狀態。

導入XMPPFramework-iOS框架進行我們自己的客戶端編寫

1. 在Build Setting 搜索Header Search Paths 添加頭文件搜索路徑:/usr/include/libxml2
2. 在Build Phasses  添加2個動態鏈接庫:libxml2.dylib  libresolve.dylib
3. 在Build Setting 搜索prefix 在Prefix Header中添加$SRCROOT/$(PRODUCT_NAME)/PrefixHeader.pch 添加pch文件,導入UIKit
4. build成功
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

3. 框架初步認識

這裏寫圖片描述
這裏寫圖片描述

0
0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章