Smack 结合 Openfire服务器,建立IM通信,发送聊天消息

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

在文章开始,请你了解和熟悉openfire方面的相关知识,这样对你理解下面代码以及下面代码的用途有很好的了解。同时,你可能需要安装一个简单的CS聊天工具,来测试你的代码是否成功的在openfire服务器上建立会话链接,并成功的向在线用户发送聊天消息。

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

http://www.cnblogs.com/hoojo/archive/2012/05/13/2498151.html(非windows 系统)

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

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

聊天软件Spark,用于测试聊天消息发送是否成功,下载地址:http://www.igniterealtime.org/downloads/download-landing.jsp?file=spark/spark_2_6_3.exe

然后你需要添加smack相关的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 协议通信

* @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服务器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服务器链接的基本配置

* @author hoojo

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

*/

@Before

publicvoidinit() {

try{

//connection = new XMPPConnection(server);

//connection.connect();

/** 5222是openfire服务器默认的通信端口,你可以登录http://192.168.8.32:9090/到管理员控制台查看客户端到服务器端口 */

config =newConnectionConfiguration(server, 5222);

/** 是否启用压缩 */

config.setCompressionEnabled(true);

/** 是否启用安全验证 */

config.setSASLAuthenticationEnabled(true);

/** 是否启用调试 */

config.setDebuggerEnabled(false);

//config.setReconnectionAllowed(true);

//config.setRosterLoadedAtLogin(true);

/** 创建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 的基本配置相关信息

* @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());

/** 是否有权限 */

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{

/** 创建一个用户boy,密码为boy;你可以在管理员控制台页面http://192.168.8.32:9090/user-summary.jsp查看用户/组的相关信息,来查看是否成功创建用户 */

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

/** 修改密码 */

accountManager.changePassword("abc");

}catch(XMPPException e) {

e.printStackTrace();

}

}

@Test

publicvoidtestUser() {

try{

/** 用户登陆,用户名、密码 */

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

}catch(XMPPException e) {

e.printStackTrace();

}

/** 获取当前登陆用户 */

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

/** 所有用户组 */

Roster roster = connection.getRoster();

/** 好友用户组,你可以用Spark添加用户好友,这样这里就可以查询到相关的数据 */

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("-------------------------------");

/** 未处理、验证好友,添加过的好友,没有得到对方同意 */

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);

/** 更改用户状态,available=true表示在线,false表示离线,status状态签名;当你登陆后,在Spark客户端软件中就可以看到你登陆的状态 */

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 发送聊天消息,此时你需要用Spark软件登陆jojo这个用户,

* 这样代码就可以向jojo这个用户发送聊天消息,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() {

/** 设置状态 */

try{

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

}catch(XMPPException e) {

e.printStackTrace();

}

/** 设置状态 */

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

presence.setStatus("Q我吧");

connection.sendPacket(presence);

/** 获取当前登陆用户的聊天管理器 */

ChatManager chatManager = connection.getChatManager();

/** 为指定用户创建一个chat,MyMessageListeners用于监听对方发过来的消息  */

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

try{

/** 发送消息 */

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

/** 用message对象发送消息 */

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: 消息监听器,用户监听对方发送的消息,也可以想对方发送消息

* @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{

/** 发送消息 */

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的基本功能,还有更多的东西需要研究,下次有机会再分享!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • 关于XMPP最权威的讲解:http://www.jabbercn.org/RFC3920(这个才是最权威的,下面文...
    随风飘荡的小逗逼阅读 1,481评论 1 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • 一、Smack库概述     Smack是一个开源、易用的XMPP/Jabber客户端库,它使用Java语言开发,...
    AndryYu阅读 6,069评论 2 13
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,602评论 18 399
  • 昨天儿子抗拒我检查让的作业,今天晚上他写作业前我告诉他,认真写,我要检查一下,他同意了。 晚上,他自己在屋里写作业...
    初心不移阅读 140评论 0 0