Android平臺下基於XMPP的IM研究(一)
由於專案需要做一個基於XMPP協議的Android通訊軟體。故開始研究XMPP
XMPP協議採用的是客戶端-伺服器架構,所有從一個客戶端發到另一個客戶端的訊息和資料都必須經過XMPP伺服器轉發,而且支援伺服器間DNS的路由,也就是說可以構建伺服器叢集,使不同的
伺服器下的客戶端也可以通訊,XMPP的前身是一個開源組織制定的網路通訊協議——Jabber,XMPP的核心是在網路上分片段傳送XML流的協議,這個協議是XMPP的即時通訊指令的傳遞手段。
為了防止伺服器間傳送的資料被篡改或偷聽,XMPP伺服器通訊引入了TLS機制,使用TLS機制能實現資料的加密,從而保證了在資料傳輸過程種資料的安全。
一個XMPP實體的地址稱為Jabber Identifier或JID,作用類似於IP地址。一個合法的JID包括節點名,域名資源名,其格式為:jid=[node'@']domain['/'resource]
XMPP協議的名稱空間:
jabber:iq:private -- 私有資料儲存,用於本地使用者私人設定資訊,比如使用者備註等。
jabber:iq:conference -- 一般會議,用於多個使用者之間的資訊共享
jabber:x:encrypted -- 加密的訊息,用於傳送加密訊息
jabber:x:expire -- 訊息終止
jabber:iq:time -- 客戶端時間
jabber:iq:auth -- 簡單使用者認證,一般用於伺服器之間或者伺服器和客戶端之間的認證
jabber:x:roster -- 內部花名冊
jabber:x:signed -- 標記的線上狀態
jabber:iq:search -- 使用者資料庫查詢,用於向伺服器傳送查詢請求
jabber:iq:register -- 註冊請求,用於使用者註冊相關資訊
jabber:x:iq:roster -- 花名冊管理
jabber:x:conference -- 會議邀請,用於向參加會議使用者傳送開會通知
jabber:x:event -- 訊息事件
vcard-temp -- 臨時的vCard,用於設定使用者的頭像以及暱稱等
在網上找了下,有開源的專案BEEM,開源的用於android的xmpp框架asmack,asmack是smack的android版本。現在開始學習smack
。Xmpp就是神馬東西,就不廢話了。首先在網上下一個Openfire和Spack,不知道這兩個是什麼東西,就直接google吧。安裝openfire需要mysql的支援,當然,oracle,sqlserver肯定是可以的。還是先上圖吧:
Openfire + Spark + MyXMPPP
- import java.io.InputStreamReader;
- import java.util.Collection;
- import org.jivesoftware.smack.Chat;
- import org.jivesoftware.smack.ChatManager;
- import org.jivesoftware.smack.ChatManagerListener;
- import org.jivesoftware.smack.ConnectionConfiguration;
- import org.jivesoftware.smack.MessageListener;
- import org.jivesoftware.smack.PrivacyListManager;
- import org.jivesoftware.smack.Roster;
- import org.jivesoftware.smack.RosterEntry;
- import org.jivesoftware.smack.RosterGroup;
- import org.jivesoftware.smack.RosterListener;
- import org.jivesoftware.smack.XMPPConnection;
- import org.jivesoftware.smack.packet.Message;
- import org.jivesoftware.smack.packet.Presence;
- public class TestSmack {
- public static void main(String[] args) {XMPPConnection.DEBUG_ENABLED = true;
- //我的電腦IP:10.16.25.90
- final ConnectionConfiguration connectionConfig = new ConnectionConfiguration("10.16.25.91", 5222, "");
- connectionConfig.setSASLAuthenticationEnabled(false);
- try {
- XMPPConnection connection = new XMPPConnection(connectionConfig);
- connection.connect();//連線
- connection.login("test", "test");//登陸
- System.out.println(connection.getUser());
- ChatManager chatmanager = connection.getChatManager();
- //新建一個會話
- Chat newChat = chatmanager.createChat("test3@pc2010102716", new MessageListener() {
- public void processMessage(Chat chat, Message message) {
- System.out.println("Received from 【" + message.getFrom() + "】 message: " + message.getBody());
- }
- });
- // 監聽被動接收訊息,或廣播訊息監聽器
- chatmanager.addChatListener(new ChatManagerListener() {
- @Override
- public void chatCreated(Chat chat, boolean createdLocally) {
- chat.addMessageListener(new MessageListener() {
- @Override
- public void processMessage(Chat chat, Message message) {
- System.out.println("Received from 【" + message.getFrom() + "】 message: " + message.getBody());
- }
- });
- }
- });
- //傳送訊息
- newChat.sendMessage("我是菜鳥");
- //獲取花名冊
- Roster roster = connection.getRoster();
- Collection<RosterEntry> entries = roster.getEntries();
- for(RosterEntry entry : entries) {
- System.out.print(entry.getName() + " - " + entry.getUser() + " - " + entry.getType() + " - " + entry.getGroups().size());
- Presence presence = roster.getPresence(entry.getUser());
- System.out.println(" - " + presence.getStatus() +" - "+ presence.getFrom());
- }
- //新增花名冊監聽器,監聽好友狀態的改變。
- roster.addRosterListener(new RosterListener() {
- @Override
- public void entriesAdded(Collection<String> addresses) {
- System.out.println("entriesAdded");
- }
- @Override
- public void entriesUpdated(Collection<String> addresses) {
- System.out.println("entriesUpdated");
- }
- @Override
- public void entriesDeleted(Collection<String> addresses) {
- System.out.println("entriesDeleted");
- }
- @Override
- public void presenceChanged(Presence presence) {
- System.out.println("presenceChanged - >" + presence.getStatus());
- }
- });
- //建立組
- // /RosterGroup group = roster.createGroup("大學");
- // for(RosterEntry entry : entries) {
- // group.addEntry(entry);
- // }
- for(RosterGroup g : roster.getGroups()) {
- for(RosterEntry entry : g.getEntries()) {
- System.out.println("Group " +g.getName() +" >> " + entry.getName() + " - " + entry.getUser() + " - " + entry.getType() + " - " + entry.getGroups().size());
- }
- }
- //傳送訊息
- BufferedReader cmdIn = new BufferedReader(new InputStreamReader(System.in));
- while(true) {
- try {
- String cmd = cmdIn.readLine();
- if("!q".equalsIgnoreCase(cmd)) {
- break;
- }
- newChat.sendMessage(cmd);
- }catch(Exception ex) {
- }
- }
- connection.disconnect();
- System.exit(0);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
以上程式碼如果在一般的Java Project上執行需要加入smack.jar 和klmx2.jar,如果是Android Project,基本程式碼不需改變只需將其放入onCreate(...)方法下即可,需要加入asmack.jar包.
1、ConnectionConfiguration
作為用於與XMPP服務建立連線的配置。它能配置;連線是否使用TLS,SASL加密。
包含內嵌類:ConnectionConfiguration.SecurityMode
2、XMPPConnection.
XMPPConnection這個類用來連線XMPP服務.
可以使用connect()方法建立與伺服器的連線。disconnect()方法斷開與伺服器的連線.
在建立連線前可以使用XMPPConnection.DEBUG_ENABLED = true; 使開發過程中可以彈出一個GUI視窗,用於顯示我們的連線與傳送Packet的資訊。
3、ChatManager
用於監控當前所有chat。可以使用createChat(String userJID, MessageListener listener)建立一個聊天。
4、Chat
Chat用於監控兩個使用者間的一系列message。使用addMessageListener(MessageListener listener)當有任何訊息到達時將會觸發listener的processMessage(Chat chat, Message message)
方法.
我們可以使用sendMessage()傳送訊息,這個方法有兩個過載方法,一種類型別的引數時String型別,另一種則是傳入Message物件(後面介紹)。
那麼有這樣一種情況,當別人主動跟我們建立連線傳送訊息,或者系統傳送訊息時我們怎麼才能接收訊息呢?
我現在是這樣操作的:
chatmanager.addChatListener(new ChatManagerListener() {
@Override
public void chatCreated(Chat chat, boolean createdLocally) {
chat.addMessageListener(new MessageListener() {
@Override
public void processMessage(Chat chat, Message message) {
System.out.println("Received message: " + message.getBody());
}
});
}
});
5、Message
Message用於表示一個訊息包(可以用除錯工具看到傳送包和接收包的具體內容)。它有以下多種型別。
Message.Type.NORMAL -- (預設)文字訊息(比如郵件)
Message.Type.CHAT -- 典型的短訊息,如QQ聊天的一行一行顯示的訊息
Message.Type.GROUP_CHAT -- 群聊訊息
Message.Type.HEADLINE -- 滾動顯示的訊息
Message.TYPE.ERROR -- 錯誤的訊息
Message有兩個內部類:
Message.Body -- 表示訊息體
Message.Type -- 表示訊息型別
6、Roster
表示儲存了很多RosterEntry的一個花名冊.為了易於管理,花名冊的項被分貝到了各個group中.
當建立與XMPP服務的連線後可以使用connection.getRoster()獲取Roster物件。
別的使用者可以使用一個訂閱請求(相當於QQ加好友)嘗試訂閱目的使用者。可以使用列舉型別Roster.SubscriptionMode的值處理這些請求:
accept_all: 接收所有訂閱請求
reject_all:拒絕所有訂閱請求
manual: 手工處理訂閱請求
建立組:RosterGroup group = roster.createGroup("大學");
向組中新增RosterEntry物件: group.addEntry(entry);
7、RosterEntry
表示Roster(花名冊)中的每條記錄.它包含了使用者的JID,使用者名稱,或使用者分配的暱稱.
8、RosterGroup
表示RosterEntry的組。可以使用addEntry(RosterEntry entry)新增。contains(String user) 判斷某使用者是否在組中.當然removeEntry(RosterEntry entry)就是從組中移除了。getEntries()
獲取所有RosterEntry.
9、Presence
表示XMPP狀態的packet。每個presence packet都有一個狀態。用列舉型別Presence.Type的值表示:
available -- (預設)使用者空閒狀態
unavailable -- 使用者沒空看訊息
subscribe -- 請求訂閱別人,即請求加對方為好友
subscribed -- 統一被別人訂閱,也就是確認被對方加為好友
unsubscribe -- 他取消訂閱別人,請求刪除某好友
unsubscribed -- 拒絕被別人訂閱,即拒絕對放的新增請求
error -- 當前狀態packet有錯誤
內嵌兩個列舉型別:Presence.Mode和Presence.Type.
可以使用setStatus自定義使用者當前的狀態(像QQ一樣的)
相關文章
- Android平臺下基於XMPP的IM研究(二 MultiUserChat 聊天室)Android
- 基於XMPP的即時通訊系統的建立(一)— XMPP基礎概念
- 基於XMPP協議的Android即時通訊系協議Android
- 【XMPP】基於XMPP的即時通訊解決方案
- 關於Android平臺中OpenGLES應用的初步研究Android
- Android之基於XMPP協議即時通訊軟體(一)Android協議
- 基於XMPP的即時通訊系統的建立(二)— XMPP詳解
- Android學習筆記--基於XMPP的即時通訊Android筆記
- 基於VC平臺下C++反彙編與逆向分析研究——No.1C++
- 基於Android平臺的RouterSDK設計與實現Android
- 基於LINUX平臺的自動化測試的研究與應用
- 微服務平臺下基於 GraphQL 構建 BFF 的思考微服務
- 基於Android平臺實現人臉識別Android
- 基於Netty,徒手擼IM(一):IM系統設計篇Netty
- 基於XMPP實現android客戶端與伺服器的互動Android客戶端伺服器
- 基於XMPP協議開發Android即時通訊軟體協議Android
- 基於XMPP協議Android即時通訊開源應用協議Android
- 一款高效開發平臺簡介,基於微軟.net平臺微軟
- ---慢更-基於 go 的 IM 聊天Go
- 開源一個自用的Android IM庫,基於Netty+TCP+Protobuf實現。AndroidNettyTCP
- Android基於XMPP Smack openfire 開發的聊天室(二) 【聊天資訊、成員】AndroidMac
- 基於thinkphp3.2 開發的一個教育平臺PHP
- 基於Netty的Android系統IM簡單實現原理NettyAndroid
- 基於xmpp openfire smack開發之Android客戶端開發[3]MacAndroid客戶端
- QuickMock:基於Express的快速mock平臺UIMockExpress
- 基於java的專案管理平臺Java專案管理
- 基於.NET平臺常用的框架整理框架
- Android基於XMPP Smack openfire 開發的聊天室(一)【會議服務、聊天室列表、加入】AndroidMac
- Android基於XMPP Smack openfire 開發的聊天室(三) 【新舊記錄、踢人】AndroidMac
- Android基於XMPP Smack openfire 開發的聊天室(五) 【邀請、被邀請】AndroidMac
- Google新推出的跨平臺聊天應用Hangouts不支援XMPPGo
- 基於Gin的IM聊天架構——HiChat架構
- 基於系統融合的統一監控平臺設計
- 認識一下Kotlin語言,Android平臺的SwiftKotlinAndroidSwift
- 基於JTT809協議的車輛資訊交換平臺架構方案(下級平臺)協議架構
- 基於Gitea打造一個屬於你自己的程式碼託管平臺Git
- BizWorks應⽤平臺基於KubeVela的實踐
- 基於Saltstack、Artifactory打造傳統模式下持續部署平臺模式