国产91在线无码_少妇人妻无码高清_91人妻中文字幕无码专区在线_国产福利在线播放_免费 无码 国产成年视频网站

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)場(chǎng)探測(cè),需要的朋友可以參考下

簡(jiǎn)單的IM聊天程序

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

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

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

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

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

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

在網(wǎng)上找了下,有開(kāi)源的項(xiàng)目BEEM,開(kāi)源的用于android的xmpp框架asmack,asmack是smack的android版本。現(xiàn)在開(kāi)始學(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è)會(huì)話 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)聽(tīng)被動(dòng)接收消息,或廣播消息監(jiān)聽(tīng)器 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("我是菜鳥"); //獲取花名冊(cè) 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()); } //添加花名冊(cè)監(jiān)聽(tīng)器,監(jiān)聽(tīng)好友狀態(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è)類用來(lái)連接X(jué)MPP服務(wù).

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

在創(chuàng)建連接前可以使用XMPPConnection.DEBUG_ENABLED = true; 使開(kāi)發(fā)過(guò)程中可以彈出一個(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í)將會(huì)觸發(fā)listener的processMessage(Chat chat, Message message)

方法.

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

那么有這樣一種情況,當(dāng)別人主動(dòng)跟我們建立連接發(fā)送消息,或者系統(tǒng)發(fā)送消息時(shí)我們?cè)趺床拍芙邮障⒛兀?/p>

我現(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

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

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

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

accept_all: 接收所有訂閱請(qǐng)求

reject_all:拒絕所有訂閱請(qǐng)求

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

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

相關(guān)推薦