博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Smack 结合 Openfire服务器,建立IM通信,发送聊天消息
阅读量:4597 次
发布时间:2019-06-09

本文共 9165 字,大约阅读时间需要 30 分钟。

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

必须了解:

(非windows 系统)

可选:

 

,用于测试聊天消息发送是否成功,下载地址:

 

然后你需要添加smack相关的jar包

smack.jar

smackx.jar

jar包下载地址:

代码中还用到了junit,junit jar下载地址:

 

下面开始代码部分

package com.hoo.smack;import java.util.Collection;import java.util.Iterator;import javax.net.SocketFactory;import org.jivesoftware.smack.AccountManager;import org.jivesoftware.smack.Chat;import org.jivesoftware.smack.ChatManager;import org.jivesoftware.smack.Connection;import org.jivesoftware.smack.ConnectionConfiguration;import org.jivesoftware.smack.MessageListener;import org.jivesoftware.smack.Roster;import org.jivesoftware.smack.RosterEntry;import org.jivesoftware.smack.XMPPConnection;import org.jivesoftware.smack.XMPPException;import org.jivesoftware.smack.packet.Message;import org.jivesoftware.smack.packet.Presence;import org.jivesoftware.smack.packet.Session;import org.jivesoftware.smack.packet.Message.Type;import org.junit.After;import org.junit.Before;import org.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 */public class SmackXMPPTest {	private Connection connection;	private ConnectionConfiguration config;	/** openfire服务器address */	private final static String server = "192.168.8.32";		private final void fail(Object o) {		if (o != null) {			System.out.println(o);		}	}		private final void fail(Object o, Object... args) {		if (o != null && args != null && args.length > 0) {			String s = o.toString();			for (int i = 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	public void init() {		try {			//connection = new XMPPConnection(server);			//connection.connect();			            /** 5222是openfire服务器默认的通信端口,你可以登录http://192.168.8.32:9090/到管理员控制台查看客户端到服务器端口 */			config = new ConnectionConfiguration(server, 5222);						/** 是否启用压缩 */ 			config.setCompressionEnabled(true);			/** 是否启用安全验证 */			config.setSASLAuthenticationEnabled(true);			/** 是否启用调试 */			config.setDebuggerEnabled(false);			//config.setReconnectionAllowed(true);			//config.setRosterLoadedAtLogin(true);						/** 创建connection链接 */			connection = new XMPPConnection(config);			/** 建立连接 */			connection.connect();		} catch (XMPPException e) {			e.printStackTrace();		}		fail(connection);		fail(connection.getConnectionID());	}		@After	public void destory() {		if (connection != null) {			connection.disconnect();			connection = null;		}	}		/**	 * function: ConnectionConfiguration 的基本配置相关信息	 * @author hoojo	 * @createDate 2012-6-25 下午04:11:25	 */	@Test	public void testConfig() {		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	public void testConnection() {		/** 用户管理 */		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	public void testAccountManager() {		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	public void testUser() {		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") public void testPacket() { 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 = new Presence(Presence.Type.available); presence.setStatus("Q我吧"); connection.sendPacket(presence); Session session = new Session(); String sessid = session.nextID(); connection.sendPacket(session); /** * 向jojo@192.168.8.32 发送聊天消息,此时你需要用Spark软件登陆jojo这个用户, * 这样代码就可以向jojo这个用户发送聊天消息,Spark登陆的jojo用户就可以接收到消息 **/ /** Type.chat 表示聊天,groupchat多人聊天,error错误,headline在线用户; */ Message message = new Message("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 public void testChatManager() { /** 设置状态 */ try { connection.login("hoojo", "hoojo"); } catch (XMPPException e) { e.printStackTrace(); } /** 设置状态 */ Presence presence = new Presence(Presence.Type.available); presence.setStatus("Q我吧"); connection.sendPacket(presence); /** 获取当前登陆用户的聊天管理器 */ ChatManager chatManager = connection.getChatManager(); /** 为指定用户创建一个chat,MyMessageListeners用于监听对方发过来的消息 */ Chat chat = chatManager.createChat("jojo@" + server, new MyMessageListeners()); try { /** 发送消息 */ chat.sendMessage("h!~ jojo……"); /** 用message对象发送消息 */ Message message = new Message(); 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 */ class MyMessageListeners implements MessageListener { public void processMessage(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的基本功能,还有更多的东西需要研究,下次有机会再分享!

转载于:https://www.cnblogs.com/javaTest/archive/2012/06/25/2589294.html

你可能感兴趣的文章
[POJ2689]Prime Distance
查看>>
python连接zookeeper的日志问题
查看>>
pycharm上传代码到码云错误现象用户密码
查看>>
柔性数组-读《深度探索C++对象模型》有感
查看>>
rmdir 命令(转)
查看>>
生产者消费者
查看>>
Contos 安装Tomcat
查看>>
Python编程Day3—基本运算符、数据类型
查看>>
在Delphi中静态调用DLL 引用外部Dll External Dll 导入Dll
查看>>
How to get AutoCAD Mtext content
查看>>
程序员技术练级攻略
查看>>
Java开发微信公众号
查看>>
【C语言】给一组组数,仅仅有两个数仅仅出现了一次,其它全部数都是成对出现的,找出这两个数。...
查看>>
CAF(C++ actor framework)(序列化之复杂类,分析 还有自己不懂的细思恐极函数实现)(三)...
查看>>
18.5.19 自测
查看>>
决策树(Decision Trees)
查看>>
为什么Java字符串是不可变对象?
查看>>
最近挖的坑
查看>>
python-变量
查看>>
MD5-总结
查看>>