Smack 結(jié)合 Openfire服務(wù)器,建立IM通信钥勋,發(fā)送聊天消息

地址:http://www.blogjava.net/hoojo/archive/2012/06/25/381445.html

在文章開始,請你了解和熟悉openfire方面的相關(guān)知識辆苔,這樣對你理解下面代碼以及下面代碼的用途有很好的了解算灸。同時(shí),你可能需要安裝一個簡單的CS聊天工具姑子,來測試你的代碼是否成功的在openfire服務(wù)器上建立會話鏈接账胧,并成功的向在線用戶發(fā)送聊天消息怪与。

必須了解:http://www.cnblogs.com/hoojo/archive/2012/05/17/2506769.html

http://www.cnblogs.com/hoojo/archive/2012/05/13/2498151.html(非windows 系統(tǒng))

可選:http://www.cnblogs.com/hoojo/archive/2012/05/17/2506845.html

http://www.cnblogs.com/hoojo/archive/2012/06/18/2553975.html

聊天軟件Spark,用于測試聊天消息發(fā)送是否成功屹徘,下載地址:http://www.igniterealtime.org/downloads/download-landing.jsp?file=spark/spark_2_6_3.exe

然后你需要添加smack相關(guān)的jar包

smack.jar

smackx.jar

jar包下載地址:http://www.igniterealtime.org/downloads/download-landing.jsp?file=smack/smack_3_2_2.zip

代碼中還用到了junit捍靠,junit jar下載地址:http://ebr.springsource.com/repository/app/bundle/version/download?name=com.springsource.org.junit&version=4.8.2&type=binary

下面開始代碼部分

packagecom.hoo.smack;

importjava.util.Collection;

importjava.util.Iterator;

importjavax.net.SocketFactory;

importorg.jivesoftware.smack.AccountManager;

importorg.jivesoftware.smack.Chat;

importorg.jivesoftware.smack.ChatManager;

importorg.jivesoftware.smack.Connection;

importorg.jivesoftware.smack.ConnectionConfiguration;

importorg.jivesoftware.smack.MessageListener;

importorg.jivesoftware.smack.Roster;

importorg.jivesoftware.smack.RosterEntry;

importorg.jivesoftware.smack.XMPPConnection;

importorg.jivesoftware.smack.XMPPException;

importorg.jivesoftware.smack.packet.Message;

importorg.jivesoftware.smack.packet.Presence;

importorg.jivesoftware.smack.packet.Session;

importorg.jivesoftware.smack.packet.Message.Type;

importorg.junit.After;

importorg.junit.Before;

importorg.junit.Test;

/**

* function: 利用Smack框架完成 XMPP 協(xié)議通信

* @author hoojo

* @createDate 2012-5-22 上午10:28:18

* @file ConnectionServerTest.java

* @package com.hoo.smack.conn

* @project jwchat

* @blog http://blog.csdn.net/IBM_hoojo

* @email hoojo_@126.com

* @version 1.0

*/

publicclassSmackXMPPTest {

privateConnection connection;

privateConnectionConfiguration config;

/** openfire服務(wù)器address */

privatefinalstaticString server ="192.168.8.32";

privatefinalvoidfail(Object o) {

if(o != null) {

System.out.println(o);

}

}

privatefinalvoidfail(Object o, Object... args) {

if(o != null && args != null && args.length > 0) {

String s = o.toString();

for(inti = 0; i < args.length; i++) {

String item = args[i] == null ?"": args[i].toString();

if(s.contains("{"+ i +"}")) {

s = s.replace("{"+ i +"}", item);

}else{

s +=" "+ item;

}

}

System.out.println(s);

}

}

/**

* function: 初始Smack對openfire服務(wù)器鏈接的基本配置

* @author hoojo

* @createDate 2012-6-25 下午04:06:42

*/

@Before

publicvoidinit() {

try{

//connection = new XMPPConnection(server);

//connection.connect();

/** 5222是openfire服務(wù)器默認(rèn)的通信端口沐旨,你可以登錄http://192.168.8.32:9090/到管理員控制臺查看客戶端到服務(wù)器端口 */

config =newConnectionConfiguration(server, 5222);

/** 是否啟用壓縮 */

config.setCompressionEnabled(true);

/** 是否啟用安全驗(yàn)證 */

config.setSASLAuthenticationEnabled(true);

/** 是否啟用調(diào)試 */

config.setDebuggerEnabled(false);

//config.setReconnectionAllowed(true);

//config.setRosterLoadedAtLogin(true);

/** 創(chuàng)建connection鏈接 */

connection =newXMPPConnection(config);

/** 建立連接 */

connection.connect();

}catch(XMPPException e) {

e.printStackTrace();

}

fail(connection);

fail(connection.getConnectionID());

}

@After

publicvoiddestory() {

if(connection != null) {

connection.disconnect();

connection = null;

}

}

/**

* function: ConnectionConfiguration 的基本配置相關(guān)信息

* @author hoojo

* @createDate 2012-6-25 下午04:11:25

*/

@Test

publicvoidtestConfig() {

fail("PKCS11Library: "+ config.getPKCS11Library());

fail("ServiceName: {0}", config.getServiceName());

// ssl證書密碼

fail("TruststorePassword: {0}", config.getTruststorePassword());

fail("TruststorePath: {0}", config.getTruststorePath());

fail("TruststoreType: {0}", config.getTruststoreType());

SocketFactory socketFactory = config.getSocketFactory();

fail("SocketFactory: {0}", socketFactory);

/*try {

fail("createSocket: {0}", socketFactory.createSocket("localhost", 3333));

} catch (IOException e) {

e.printStackTrace();

}*/

}

/**

* function: Connection 基本方法信息

* @author hoojo

* @createDate 2012-6-25 下午04:12:04

*/

@Test

publicvoidtestConnection() {

/** 用戶管理 */

AccountManager accountManager = connection.getAccountManager();

for(String attr : accountManager.getAccountAttributes()) {

fail("AccountAttribute: {0}", attr);

}

fail("AccountInstructions: {0}", accountManager.getAccountInstructions());

/** 是否鏈接 */

fail("isConnected:", connection.isConnected());

fail("isAnonymous:", connection.isAnonymous());

/** 是否有權(quán)限 */

fail("isAuthenticated:", connection.isAuthenticated());

fail("isSecureConnection:", connection.isSecureConnection());

/** 是否使用壓縮 */

fail("isUsingCompression:", connection.isUsingCompression());

}

/**

* function: 用戶管理器

* @author hoojo

* @createDate 2012-6-25 下午04:22:31

*/

@Test

publicvoidtestAccountManager() {

AccountManager accountManager = connection.getAccountManager();

for(String attr : accountManager.getAccountAttributes()) {

fail("AccountAttribute: {0}", attr);

}

fail("AccountInstructions: {0}", accountManager.getAccountInstructions());

fail("supportsAccountCreation: {0}", accountManager.supportsAccountCreation());

try{

/** 創(chuàng)建一個用戶boy,密碼為boy榨婆;你可以在管理員控制臺頁面http://192.168.8.32:9090/user-summary.jsp查看用戶/組的相關(guān)信息磁携,來查看是否成功創(chuàng)建用戶 */

accountManager.createAccount("boy","boy");

/** 修改密碼 */

accountManager.changePassword("abc");

}catch(XMPPException e) {

e.printStackTrace();

}

}

@Test

publicvoidtestUser() {

try{

/** 用戶登陸,用戶名良风、密碼 */

connection.login("hoojo","hoojo");

}catch(XMPPException e) {

e.printStackTrace();

}

/** 獲取當(dāng)前登陸用戶 */

fail("User:", connection.getUser());

/** 所有用戶組 */

Roster roster = connection.getRoster();

/** 好友用戶組谊迄,你可以用Spark添加用戶好友,這樣這里就可以查詢到相關(guān)的數(shù)據(jù) */

Collection rosterEntiry = roster.getEntries();

Iterator iter = rosterEntiry.iterator();

while(iter.hasNext()) {

RosterEntry entry = iter.next();

fail("Groups: {0}, Name: {1}, Status: {2}, Type: {3}, User: {4}", entry.getGroups(), entry.getName(), entry.getStatus(), entry.getType(), entry);

}

fail("-------------------------------");

/** 未處理烟央、驗(yàn)證好友统诺,添加過的好友,沒有得到對方同意 */

Collection unfiledEntries = roster.getUnfiledEntries();

iter = unfiledEntries.iterator();

while(iter.hasNext()) {

RosterEntry entry = iter.next();

fail("Groups: {0}, Name: {1}, Status: {2}, Type: {3}, User: {4}", entry.getGroups(), entry.getName(), entry.getStatus(), entry.getType(), entry);

}

}

@Test

@SuppressWarnings("static-access")

publicvoidtestPacket() {

try{

connection.login("hoojo","hoojo");

}catch(XMPPException e) {

e.printStackTrace();

}

//Packet packet = new Data(new DataPacketExtension("jojo@" + server, 2, "this is a message"));

//connection.sendPacket(packet);

/** 更改用戶狀態(tài)疑俭,available=true表示在線粮呢,false表示離線,status狀態(tài)簽名;當(dāng)你登陸后啄寡,在Spark客戶端軟件中就可以看到你登陸的狀態(tài) */

Presence presence =newPresence(Presence.Type.available);

presence.setStatus("Q我吧");

connection.sendPacket(presence);

Session session =newSession();

String sessid = session.nextID();

connection.sendPacket(session);

/** 向jojo@192.168.8.32 發(fā)送聊天消息豪硅,此時(shí)你需要用Spark軟件登陸jojo這個用戶,

* 這樣代碼就可以向jojo這個用戶發(fā)送聊天消息挺物,Spark登陸的jojo用戶就可以接收到消息

**/

/** Type.chat 表示聊天懒浮,groupchat多人聊天,error錯誤识藤,headline在線用戶嵌溢; */

Message message =newMessage("jojo@"+ server, Type.chat);

//Message message = new Message(sessid, Type.chat);

message.setBody("h!~ jojo, I'am is hoojo!");

connection.sendPacket(message);

try{

Thread.sleep(1);

}catch(InterruptedException e) {

e.printStackTrace();

}

}

/**

* function: 測試聊天消息管理類

* @author hoojo

* @createDate 2012-6-25 下午05:03:23

*/

@Test

publicvoidtestChatManager() {

/** 設(shè)置狀態(tài) */

try{

connection.login("hoojo","hoojo");

}catch(XMPPException e) {

e.printStackTrace();

}

/** 設(shè)置狀態(tài) */

Presence presence =newPresence(Presence.Type.available);

presence.setStatus("Q我吧");

connection.sendPacket(presence);

/** 獲取當(dāng)前登陸用戶的聊天管理器 */

ChatManager chatManager = connection.getChatManager();

/** 為指定用戶創(chuàng)建一個chat,MyMessageListeners用于監(jiān)聽對方發(fā)過來的消息? */

Chat chat = chatManager.createChat("jojo@"+ server,newMyMessageListeners());

try{

/** 發(fā)送消息 */

chat.sendMessage("h!~ jojo……");

/** 用message對象發(fā)送消息 */

Message message =newMessage();

message.setBody("message");

message.setProperty("color","red");

chat.sendMessage(message);

}catch(XMPPException e) {

e.printStackTrace();

}

try{

Thread.sleep(1000 * 1000);

}catch(InterruptedException e) {

e.printStackTrace();

}

}

/**

* function: 消息監(jiān)聽器蹋岩,用戶監(jiān)聽對方發(fā)送的消息赖草,也可以想對方發(fā)送消息

* @author hoojo

* @createDate 2012-6-25 下午05:05:31

* @file SmackXMPPTest.java

* @package com.hoo.smack

* @project jwchat

* @blog http://blog.csdn.net/IBM_hoojo

* @email hoojo_@126.com

* @version 1.0

*/

classMyMessageListenersimplementsMessageListener {

publicvoidprocessMessage(Chat chat, Message message) {

try{

/** 發(fā)送消息 */

chat.sendMessage("dingding……"+ message.getBody());

}catch(XMPPException e) {

e.printStackTrace();

}

/** 接收消息 */

fail("From: {0}, To: {1}, Type: {2}, Sub: {3}", message.getFrom(), message.getTo(), message.getType(), message.toXML());

/*Collection bodys =? message.getBodies();

for (Body body : bodys) {

fail("bodies[{0}]", body.getMessage());

}

//fail(message.getLanguage());

//fail(message.getThread());

//fail(message.getXmlns());*/

fail("body: ", message.getBody());

}

}

}

好了,這些都是smack的基本功能剪个,還有更多的東西需要研究秧骑,下次有機(jī)會再分享!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扣囊,一起剝皮案震驚了整個濱河市乎折,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侵歇,老刑警劉巖骂澄,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異惕虑,居然都是意外死亡坟冲,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門溃蔫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來健提,“玉大人,你說我怎么就攤上這事伟叛∷奖裕” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵统刮,是天一觀的道長紊遵。 經(jīng)常有香客問我,道長侥蒙,這世上最難降的妖魔是什么暗膜? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮辉哥,結(jié)果婚禮上桦山,老公的妹妹穿的比我還像新娘攒射。我一直安慰自己,他們只是感情好恒水,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布会放。 她就那樣靜靜地躺著,像睡著了一般钉凌。 火紅的嫁衣襯著肌膚如雪咧最。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天御雕,我揣著相機(jī)與錄音矢沿,去河邊找鬼。 笑死酸纲,一個胖子當(dāng)著我的面吹牛捣鲸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播闽坡,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼栽惶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疾嗅?” 一聲冷哼從身側(cè)響起外厂,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎代承,沒想到半個月后汁蝶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡论悴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年掖棉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片意荤。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡啊片,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出玖像,到底是詐尸還是另有隱情,我是刑警寧澤齐饮,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布捐寥,位于F島的核電站,受9級特大地震影響祖驱,放射性物質(zhì)發(fā)生泄漏握恳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一捺僻、第九天 我趴在偏房一處隱蔽的房頂上張望乡洼。 院中可真熱鬧崇裁,春花似錦、人聲如沸束昵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锹雏。三九已至巴比,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間礁遵,已是汗流浹背轻绞。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留佣耐,地道東北人政勃。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像兼砖,于是被迫代替她去往敵國和親奸远。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于XMPP最權(quán)威的講解:http://www.jabbercn.org/RFC3920(這個才是最權(quán)威的掖鱼,下面文...
    隨風(fēng)飄蕩的小逗逼閱讀 1,492評論 1 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理然走,服務(wù)發(fā)現(xiàn),斷路器戏挡,智...
    卡卡羅2017閱讀 134,699評論 18 139
  • 一芍瑞、Smack庫概述 ????Smack是一個開源、易用的XMPP/Jabber客戶端庫褐墅,它使用Java語言開發(fā)拆檬,...
    AndryYu閱讀 6,147評論 2 13
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法妥凳,內(nèi)部類的語法竟贯,繼承相關(guān)的語法,異常的語法逝钥,線程的語...
    子非魚_t_閱讀 31,662評論 18 399
  • 昨天兒子抗拒我檢查讓的作業(yè)屑那,今天晚上他寫作業(yè)前我告訴他,認(rèn)真寫艘款,我要檢查一下持际,他同意了。 晚上哗咆,他自己在屋里寫作業(yè)...
    初心不移閱讀 146評論 0 0