中文字幕 日本 在线 高清,久久精品国产99精品国,超碰人人香蕉,一区二区三区无码高清视频

Android中基于XMPP協(xié)議實(shí)現(xiàn)IM聊天程序與多人聊天室(im協(xié)議 xmpp)

Android中基于XMPP協(xié)議實(shí)現(xiàn)IM聊天程序與多人聊天室

更新時(shí)間:2016年02月24日 15:59:31 作者:喝醉的毛毛蟲

這篇文章主要介紹了Android中基于XMPP協(xié)議實(shí)現(xiàn)IM聊天程序與多人聊天室的方法,XMPP基于XML數(shù)據(jù)格式傳輸,一般用于即時(shí)消息(IM)以及在線現(xiàn)場探測,需要的朋友可以參考下

簡單的IM聊天程序

由于項(xiàng)目需要做一個(gè)基于XMPP協(xié)議的Android通訊軟件。故開始研究XMPP。

XMPP協(xié)議采用的是客戶端-服務(wù)器架構(gòu),所有從一個(gè)客戶端發(fā)到另一個(gè)客戶端的消息和數(shù)據(jù)都必須經(jīng)過XMPP服務(wù)器轉(zhuǎn)發(fā),而且支持服務(wù)器間DNS的路由,也就是說可以構(gòu)建服務(wù)器集群,使不同的

服務(wù)器下的客戶端也可以通信,XMPP的前身是一個(gè)開源組織制定的網(wǎng)絡(luò)通信協(xié)議——Jabber,XMPP的核心是在網(wǎng)絡(luò)上分片段發(fā)送XML流的協(xié)議,這個(gè)協(xié)議是XMPP的即時(shí)通訊指令的傳遞手段。

為了防止服務(wù)器間發(fā)送的數(shù)據(jù)被篡改或偷聽,XMPP服務(wù)器通信引入了TLS機(jī)制,使用TLS機(jī)制能實(shí)現(xiàn)數(shù)據(jù)的加密,從而保證了在數(shù)據(jù)傳輸過程種數(shù)據(jù)的安全。

一個(gè)XMPP實(shí)體的地址稱為Jabber Identifier或JID,作用類似于IP地址。一個(gè)合法的JID包括節(jié)點(diǎn)名,域名資源名,其格式為:jid=[node'@']domain['/'resource]

XMPP協(xié)議的命名空間:

在網(wǎng)上找了下,有開源的項(xiàng)目BEEM,開源的用于android的xmpp框架asmack,asmack是smack的android版本?,F(xiàn)在開始學(xué)習(xí)smack

。Xmpp就是神馬東西,就不廢話了。首先在網(wǎng)上下一個(gè)Openfire和Spack,不知道這兩個(gè)是什么東西,就直接google吧。安裝openfire需要mysql的支持,當(dāng)然,oracle,sqlserver肯定是可以的。還是先上圖吧:

Openfire Spark MyXMPPP

Android中基于XMPP協(xié)議實(shí)現(xiàn)IM聊天程序與多人聊天室(im協(xié)議 xmpp)

Android中基于XMPP協(xié)議實(shí)現(xiàn)IM聊天程序與多人聊天室(im協(xié)議 xmpp)

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(); //新建一個(gè)會話 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()); } }); // 監(jiān)聽被動接收消息,或廣播消息監(jiān)聽器 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()); } }); } }); //發(fā)送消息 newChat.sendMessage("我是菜鳥"); //獲取花名冊 Roster roster = connection.getRoster(); Collection 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()); } //添加花名冊監(jiān)聽器,監(jiān)聽好友狀態(tài)的改變。 roster.addRosterListener(new RosterListener() { @Override public void entriesAdded(Collection addresses) { System.out.println("entriesAdded"); } @Override public void entriesUpdated(Collection addresses) { System.out.println("entriesUpdated"); } @Override public void entriesDeleted(Collection addresses) { System.out.println("entriesDeleted"); } @Override public void presenceChanged(Presence presence) { System.out.println("presenceChanged – >" presence.getStatus()); } }); //創(chuàng)建組 // /RosterGroup group = roster.createGroup("大學(xué)"); // 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()); } } //發(fā)送消息 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上運(yùn)行需要加入smack.jar 和klmx2.jar,如果是Android Project,基本代碼不需改變只需將其放入onCreate(…)方法下即可,需要加入asmack.jar包.

1、ConnectionConfiguration

作為用于與XMPP服務(wù)建立連接的配置。它能配置;連接是否使用TLS,SASL加密。

包含內(nèi)嵌類:ConnectionConfiguration.SecurityMode

2、XMPPConnection.

XMPPConnection這個(gè)類用來連接XMPP服務(wù).

可以使用connect()方法建立與服務(wù)器的連接。disconnect()方法斷開與服務(wù)器的連接.

在創(chuàng)建連接前可以使用XMPPConnection.DEBUG_ENABLED = true; 使開發(fā)過程中可以彈出一個(gè)GUI窗口,用于顯示我們的連接與發(fā)送Packet的信息。

Android中基于XMPP協(xié)議實(shí)現(xiàn)IM聊天程序與多人聊天室(im協(xié)議 xmpp)

3、ChatManager

用于監(jiān)控當(dāng)前所有chat??梢允褂胏reateChat(String userJID, MessageListener listener)創(chuàng)建一個(gè)聊天。

4、Chat

Chat用于監(jiān)控兩個(gè)用戶間的一系列message。使用addMessageListener(MessageListener listener)當(dāng)有任何消息到達(dá)時(shí)將會觸發(fā)listener的processMessage(Chat chat, Message message)

方法.

我們可以使用sendMessage()發(fā)送消息,這個(gè)方法有兩個(gè)重載方法,一種類類型的參數(shù)時(shí)String類型,另一種則是傳入Message對象(后面介紹)。

那么有這樣一種情況,當(dāng)別人主動跟我們建立連接發(fā)送消息,或者系統(tǒng)發(fā)送消息時(shí)我們怎么才能接收消息呢?

我現(xiàn)在是這樣操作的:

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

6、Roster

表示存儲了很多RosterEntry的一個(gè)花名冊.為了易于管理,花名冊的項(xiàng)被分貝到了各個(gè)group中.

當(dāng)建立與XMPP服務(wù)的連接后可以使用connection.getRoster()獲取Roster對象。

別的用戶可以使用一個(gè)訂閱請求(相當(dāng)于QQ加好友)嘗試訂閱目的用戶??梢允褂妹杜e類型Roster.SubscriptionMode的值處理這些請求:

accept_all: 接收所有訂閱請求

reject_all:拒絕所有訂閱請求

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。

(0)
上一篇 2024年9月14日 上午9:49
下一篇 2024年9月14日 上午10:00

相關(guān)推薦