1. 程式人生 > >基於XMPP的即時通訊

基於XMPP的即時通訊

一、常見即時通訊實現

socket

openfire+asmack

環信

信鴿

融雲

二、XMPP優勢

1. 開放性

XMPP協議是自由、開放、公開的,並且易於瞭解。而且在客戶端、伺服器、元件、原始碼庫等方面,都已經各自有多種實現。

2.跨平臺

客戶端只要基於XMPP協議,不管是什麼平臺(包括不同的移動終端)都可以互聯互通。

三、XMPP協議簡介  

The Extensible Messaging and Presence Protocol (可擴充套件通訊和表示協議) XMPP 以 Jabber 協議為基礎,而 Jabber 是即時通訊中常用的開放式協議。

資料格式

XML是XMPP系統架構的核心。它能表述幾乎任何一種結構化資料。特別是XMPP利用XML資料流進行客戶端一伺服器端、伺服器端一伺服器端的通訊。XML資料流一般是由客戶端發起至服務端,XML資料流的有效時間直接與使用者的線上會話有效時間相關聯。

XMPP 的特點是將複雜性從客戶端轉移到伺服器端。這使得客戶端編寫變得非常容易,更新系統功能也同樣變得容易。

XMPP中定義了三個角色:XMPP客戶端、XMPP伺服器、閘道器。

客戶端:通過 TCP 套接字與XMPP 伺服器進行通訊

伺服器:同時承擔了客戶端資訊記錄、連線管理和資訊的路由功能

閘道器:承擔著與異構即時通訊系統的互聯互通(異構系統可以包括

SMS(簡訊),MSN,ICQ等)

五、XMPP協議的地址格式(標誌)

每個客戶端需要擁有一個地址標識用於定位,XMPP 中稱之為 JID (Jabber ID)。地址標識的格式如下

[ node "@" ] domain [ "/" resource ]

例如:

[email protected]/spark

格式與 Email 地址格式類似,但增添了 resource 項(非必需的)。上述例子可以解釋為:在 gmail.com 伺服器註冊的 charley使用者,且使用 spark客戶端軟體登入。資源(resource )只用來識別屬於使用者的位置或裝置等,一個使用者可以同時以多種資源與同一個XMPP伺服器連線(說白了就是用於支援同一賬號的多客戶端登入)。

六、協議訊息格式

XMPP協議包括3個頂層XML元素:Message、Presence和IQ。

Message用來表示傳輸的訊息,當用戶傳送一條訊息時。就會在流的上下文中插入一個Message元素,中間有使用者傳送的相關資訊;

Presence用來表示使用者的狀態。當用戶改變自己的狀態時。就會在資料流的上下文中插入一個Presence元素,用來表示使用者現在的狀態;

IQ用來表示一種請求,響應機制,從一個實體傳送請求,另外一個實體接受請求並響應。

XMPP特點

1.客戶端通過TCP/IP協議連線到伺服器,然後通過XML傳輸資料。

2.XMPP的核心部分就是一個在網路上分片斷髮送XML的流協議。這個流協議是XMPP的即時通訊指令的傳遞基礎,也是一個非常重要的可以被進一步利用的網路基礎協議。所以可以說,XMPP用TCP傳的是XML流。

理論一大堆。。。。接下來貼程式碼

XmppManager.java
複製程式碼
  1 package com.example.xmppdemo.fengzhuang;
  2 
  3 import android.util.Log;
  4 
  5 
  6 
  7 import org.jivesoftware.smack.Chat;
  8 import org.jivesoftware.smack.ChatManager;
  9 import org.jivesoftware.smack.ChatManagerListener;
 10 import org.jivesoftware.smack.ConnectionConfiguration;
 11 import org.jivesoftware.smack.MessageListener;
 12 import org.jivesoftware.smack.PacketCollector;
 13 import org.jivesoftware.smack.Roster;
 14 import org.jivesoftware.smack.RosterEntry;
 15 import org.jivesoftware.smack.SmackConfiguration;
 16 import org.jivesoftware.smack.XMPPConnection;
 17 import org.jivesoftware.smack.XMPPException;
 18 import org.jivesoftware.smack.filter.AndFilter;
 19 import org.jivesoftware.smack.filter.PacketFilter;
 20 import org.jivesoftware.smack.filter.PacketIDFilter;
 21 import org.jivesoftware.smack.filter.PacketTypeFilter;
 22 import org.jivesoftware.smack.packet.IQ;
 23 import org.jivesoftware.smack.packet.Message;
 24 import org.jivesoftware.smack.packet.Presence;
 25 import org.jivesoftware.smack.packet.Registration;
 26 import org.jivesoftware.smack.provider.PrivacyProvider;
 27 import org.jivesoftware.smack.provider.ProviderManager;
 28 import org.jivesoftware.smackx.Form;
 29 import org.jivesoftware.smackx.GroupChatInvitation;
 30 import org.jivesoftware.smackx.PrivateDataManager;
 31 import org.jivesoftware.smackx.ReportedData;
 32 import org.jivesoftware.smackx.bytestreams.socks5.provider.BytestreamsProvider;
 33 import org.jivesoftware.smackx.packet.ChatStateExtension;
 34 import org.jivesoftware.smackx.packet.LastActivity;
 35 import org.jivesoftware.smackx.packet.OfflineMessageInfo;
 36 import org.jivesoftware.smackx.packet.OfflineMessageRequest;
 37 import org.jivesoftware.smackx.packet.SharedGroupsInfo;
 38 import org.jivesoftware.smackx.packet.VCard;
 39 import org.jivesoftware.smackx.provider.AdHocCommandDataProvider;
 40 import org.jivesoftware.smackx.provider.DataFormProvider;
 41 import org.jivesoftware.smackx.provider.DelayInformationProvider;
 42 import org.jivesoftware.smackx.provider.DiscoverInfoProvider;
 43 import org.jivesoftware.smackx.provider.DiscoverItemsProvider;
 44 import org.jivesoftware.smackx.provider.MUCAdminProvider;
 45 import org.jivesoftware.smackx.provider.MUCOwnerProvider;
 46 import org.jivesoftware.smackx.provider.MUCUserProvider;
 47 import org.jivesoftware.smackx.provider.MessageEventProvider;
 48 import org.jivesoftware.smackx.provider.MultipleAddressesProvider;
 49 import org.jivesoftware.smackx.provider.RosterExchangeProvider;
 50 import org.jivesoftware.smackx.provider.StreamInitiationProvider;
 51 import org.jivesoftware.smackx.provider.VCardProvider;
 52 import org.jivesoftware.smackx.provider.XHTMLExtensionProvider;
 53 import org.jivesoftware.smackx.search.UserSearch;
 54 import org.jivesoftware.smackx.search.UserSearchManager;
 55 
 56 import java.util.ArrayList;
 57 import java.util.Collection;
 58 import java.util.Collections;
 59 import java.util.Iterator;
 60 import java.util.List;
 61 
 62 /**
 63  * Created by Kelvin on 2016/12/12.
 64  */
 65 
 66 public class XmppManager {
 67 
 68     private static XmppManager xmppManager; //XmppManager的例項
 69 
 70     private XmppManager(){} //私有化構造器
 71 
 72     public static XmppManager getInstance(){
 73         if (xmppManager == null){
 74             synchronized (XmppManager.class){
 75                 if (xmppManager == null){
 76                     xmppManager = new XmppManager();
 77                 }
 78             }
 79         }
 80         return xmppManager;
 81     }
 82 
 83     //XmppConnection 連線物件
 84     private XMPPConnection xmppConnection;
 85 
 86     //將其翻譯成中文為"花名冊",用來表示一個使用者的所有好友清單以及申請加好友的使用者清單,
 87     // 為了便於管理,Roster中的使用者分組進行管理。
 88     private Roster roster;
 89 
 90     //用於接收訊息的介面
 91     private XmppManagerCallback xmppManagerCallback;
 92 
 93     //Debug標籤
 94     private final String TAG="XmppManager";
 95 
 96     /**
 97      * 開啟網路連線
 98      */
 99     private void openConnection(){
100 
101         //連線物件為空或者還沒有認證的時候(isAuthenticated()方法返回值是boolean型別,意思是是否認證)
102         if (xmppConnection == null || !xmppConnection.isAuthenticated()){
103             try {
104                 //配置連線,(引數一:伺服器ip地址,引數二:埠號,引數三:伺服器名字)
105                 ConnectionConfiguration configuration = new ConnectionConfiguration(Constant.SERVER_HOST,
106                         Constant.SERVER_PORT,Constant.SERVER_NAME);
107 
108                 //Xmpp是否可以自動重連(客戶端掉線時是否可以重新連線)
109                 configuration.setReconnectionAllowed(true);
110 
111                 //設定安全模式
112                 configuration.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
113                 //特別補充,在設定configuaration的時候對認證的設定,程式碼如下:
114                 //這個屬性預設值是true,設定時得需要與伺服器那邊統一,如果不一致,就算使用者註冊成功後,
115                 // 登入時也會返回 server-unavailable(503)錯誤,我們用的是ejabberd伺服器,預設設定SASL認證開啟,
116                 // 所以開始我設定為false,怎麼都無法登入,最後註釋這句程式碼,成功登入:)
117                 //相當於一個許可權
118                 configuration.setSASLAuthenticationEnabled(false);
119                 // 狀態設為離線,為了取離線訊息
120                 configuration.setSendPresence(true);
121                 // 配置各種Provider,如果不配置,則會無法解析資料
122                 configureConnection(ProviderManager.getInstance());
123                 xmppConnection = new XMPPConnection(configuration);
124                 //開啟連線
125                 xmppConnection.connect();
126             } catch (XMPPException e) {
127                 e.printStackTrace();
128             }
129         }
130     }
131 
132     /**
133      * 配置連線
134      * @param pm
135      */
136     public void configureConnection(ProviderManager pm) {
137         // Private Data Storage
138         pm.addIQProvider("query", "jabber:iq:private", new PrivateDataManager.PrivateDataIQProvider());
139         // Time
140         try {
141             pm.addIQProvider("query", "jabber:iq:time", Class.forName("org.jivesoftware.smackx.packet.Time"));
142         } catch (ClassNotFoundException e) {
143             Log.w("TestClient", "Can't load class for org.jivesoftware.smackx.packet.Time");
144         }
145 
146         // Roster Exchange
147         pm.addExtensionProvider("x", "jabber:x:roster", new RosterExchangeProvider());
148         // Message Events
149         pm.addExtensionProvider("x", "jabber:x:event", new MessageEventProvider());
150         // Chat State
151         pm.addExtensionProvider("active", "http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
152         pm.addExtensionProvider("composing", "http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
153         pm.addExtensionProvider("paused", "http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
154         pm.addExtensionProvider("inactive", "http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
155         pm.addExtensionProvider("gone", "http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
156         // XHTML
157         pm.addExtensionProvider("html", "http://jabber.org/protocol/xhtml-im", new XHTMLExtensionProvider());
158         // Group Chat Invitations
159         pm.addExtensionProvider("x", "jabber:x:conference", new GroupChatInvitation.Provider());
160         // Service Discovery # Items
161         pm.addIQProvider("query", "http://jabber.org/protocol/disco#items", new DiscoverItemsProvider());
162         // Service Discovery # Info
163         pm.addIQProvider("query", "http://jabber.org/protocol/disco#info", new DiscoverInfoProvider());
164         // Data Forms
165         pm.addExtensionProvider("x", "jabber:x:data", new DataFormProvider());
166         // MUC User
167         pm.addExtensionProvider("x", "http://jabber.org/protocol/muc#user", new MUCUserProvider());
168         // MUC Admin
169         pm.addIQProvider("query", "http://jabber.org/protocol/muc#admin", new MUCAdminProvider());
170         // MUC Owner
171         pm.addIQProvider(
            
           

相關推薦

XMPP即時通訊協議使用(二)——基於Smack相關操作

package com.test; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.

XMPP即時通訊資料:

//-------------------------------------------XMPP:體系架構: Client,Server,Gateway.三個角色。     1,會話管理層,:負責客戶端會話認證。線上狀態,使用者聯絡表等。     2,資料儲存器(XDB

XMPP即時通訊機制

XMPP(Extensible Messaging and Presence Protocol)可擴充套件訊息呈現處理協議,一種基於XML的協議。 1、 XMPP可以實現多個客戶端、多個伺服器、多個閘道器的即時通訊 ; 2、 通常客戶端與伺服器連線的端為

Android學習筆記--基於XMPP即時通訊

一、常見即時通訊實現 socket openfire+asmack 環信 信鴿 融雲 二、XMPP優勢 1. 開放性 XMPP協議是自由、開放、公開的,並且易於瞭解。而且在客戶端、伺服器、元件、原始碼庫等方面,都已經各自有多種實現。 2.跨平臺 客戶端只要基於X

基於XMPP即時通訊

一、常見即時通訊實現 socket openfire+asmack 環信 信鴿 融雲 二、XMPP優勢 1. 開放性 XMPP協議是自由、開放、公開的,並且易於瞭解。而且在客戶端、伺服器、元件、原始碼庫等方面,都已經

基於XMPP即時通信系統的建立

無法 解析 例如 大小寫 垃圾信息 擴展 訂閱者 結構化 基本 XMPP詳解 XMPP(eXtensible Messaging and Presence Protocol,可擴展消息處理和現場協議)是一種在兩個地點間傳遞小型結構化數據的協議。在此基礎上,XMPP協議已經被

基於node.js的即時通訊

open 註意 ges size lose 雙屏 ner 事件驅動 發現 最近都在學習HTML5,做canvas遊戲之類的,發現HTML5中除了canvas這個強大的工具外,還有WebSocket也很值得註意。可以用來做雙屏互動遊戲,何為雙屏互動遊戲?就是通過移動端設備來控

[NodeJS]NodeJS基於WebSocket的多用戶點對點即時通訊聊天

round serve i++ conn console 即時通訊 .get () str 最近給一個客戶做了一個聊天,所以就用NodeJS做了一個 原理就是用戶第一次進入後,記錄它的ID和該用戶的ws 等有人發數據的時候,就去查ID,然後找到ID對應的ws,進行消息發

Openfire XMPP Smack RTC IM 即時通訊 聊天

ray 控制臺 cati 探測 ica strong ttext 包括 login Openfire XMPP Smack RTC IM 即時通訊 聊天 目錄 目錄簡介Openfire 簡介相關的幾個名詞SmackSparkJIDXMPPOpenfire 安裝配置測

基於Netty實現的Android 訊息推送(即時通訊)的解決方案

根據Netty框架實現訊息推送(即時聊天)功能. Netty框架,TCP長連線,心跳,阻塞訊息佇列,執行緒池處理訊息傳送, 基於Google ProtoBuf自定義的訊息協議, TCP粘包/拆包.... 客戶端通過TCP連線到伺服器,並建立TCP長連線;當伺服器端收到新訊息後通過TCP連線推送給

[原始碼和文件分享]使用同一資料庫基於TCP Socket和Websocket實現的相互即時通訊系統

摘 要 隨著網路通訊和計算機技術的發展,人們越來越希望能夠即時傳送和接收網際網路訊息。與此同時隨著網際網路的發展在HTML5中提出了websocket協議,能更好的節省伺服器資源和頻寬並且伺服器和瀏覽器能夠雙向實時通訊。為了能讓使用者體驗傳統客戶端和web帶來的即時通訊結合的超爽體驗,本次畢業設

【原創】基於第三方融雲的即時通訊--轉載請註明出處

一、融雲接入架構       融雲在進行接入時,具有不影響原APP架構的特性,提供有專門的sdk用於進行APP端的開發。在不需要自身伺服器的前提下,可以使APP與融雲伺服器進行自行互動。同時服務端可以與融雲服務端以API呼叫的形式進行互相互動,提供的功能有訊息推

Websocket全講解。跨平臺的通訊協議 !!基於websocket的高併發即時通訊伺服器開發

本博文,保證不用裝B的話語和太多專業的語言,保證簡單易懂,只要懂JAVAEE開發的人都可以看懂。 本博文發表目的是,目前網上針對Websocket的資料太散亂,導致初學者的知識體系零零散散,學習困難加大。本博加以整理,並且實踐。 所用核心技術選型:

android 使用xmpp smack openfire實現即時通訊(一)

介紹: XMPP :XMPP(可擴充套件訊息處理現場協議)是基於可擴充套件標記語言(XML)的協議,它用於即時訊息(IM)以及線上現場探測。  smack:是一個開源包,易於使用的XMPP(jabber)客戶端類庫 openfire :作為伺服器提供服務。 ope

iOS 基於環信SDK實現即時通訊-語音、視訊聊天

這裡建立的專案是在文字聊天專案:http://blog.csdn.net/create_pro/article/details/62420040基礎上新增的功能,所以可能需要先去連結文章地址檢視整合過程,具體專案連結在下面,這裡只介紹使用環信SDK整合語音、視訊

XMPP即時通訊內容學習(一)

一直聽朋友們說xmpp,怎麼好怎麼流行,我也挺感興趣,可是由於最近工作很忙,沒有時間看,今天終於抽出時間研究了一下,首先是XMPP到底是什麼? XMPP是:是一種以XML為基礎的開放式實時通訊協議,是經由網際網路工程工作小組(IETF)通過的網際網路標準。XMPP因為被Go

基於nodejs + websocket 搭建即時通訊應用

如果說AJAX是像手機發簡訊一樣,傳送資訊,獲取資訊,那麼websocket技術則是打電話這樣。Web領域的實時推送技術,也被稱作Realtime技術。這種技術要達到的目的是讓使用者不需要重新整理瀏覽器就可以獲得實時更新。在以前你可能會使用AJAX進行輪詢,這造成了伺服器的多

xmpp開發IM即時通訊系列(一)--總述

    本人近期研究即時通訊功能,社交元素現在已經滲透到各個領域,無論商城、遊戲、媒體類等app,為了增加使用者之間的交流,都已經開始加入即時通訊功能,可以說即時通訊在未來的手機商業應用領域是不可或缺

Android基於XMPP Smack Openfire開發IM【四】初步實現兩個客戶端通訊

本部落格要介紹的內容: Openfire做伺服器端,兩個客戶端:Spark、android模擬器。實現兩個客戶端之間的通訊。 第一步:啟動openfire伺服器。(這裡需要用到兩個使用者登入,前面的部落格中已經說明如何新增使用者了。) [img] [/img] 第

【原創】基於第三方融雲的即時通訊

一、融雲接入架構       融雲在進行接入時,具有不影響原APP架構的特性,提供有專門的sdk用於進行APP端的開發。在不需要自身伺服器的前提下,可以使APP與融雲伺服器進行自行互動。同時服務端可以與融雲服務端以API呼叫的形式進行互相互動,提供的功能有訊息推送,訊息路由