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

2024-06-21 00:58

本文主要是介绍Smack 结合 Openfire服务器,建立IM通信,发送聊天消息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在文章开始,请你了解和熟悉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

 

下面开始代码部分

[java]  view plain copy print ?
  1. package com.hoo.smack;  
  2.   
  3. import java.util.Collection;  
  4. import java.util.Iterator;  
  5. import javax.net.SocketFactory;  
  6. import org.jivesoftware.smack.AccountManager;  
  7. import org.jivesoftware.smack.Chat;  
  8. import org.jivesoftware.smack.ChatManager;  
  9. import org.jivesoftware.smack.Connection;  
  10. import org.jivesoftware.smack.ConnectionConfiguration;  
  11. import org.jivesoftware.smack.MessageListener;  
  12. import org.jivesoftware.smack.Roster;  
  13. import org.jivesoftware.smack.RosterEntry;  
  14. import org.jivesoftware.smack.XMPPConnection;  
  15. import org.jivesoftware.smack.XMPPException;  
  16. import org.jivesoftware.smack.packet.Message;  
  17. import org.jivesoftware.smack.packet.Presence;  
  18. import org.jivesoftware.smack.packet.Session;  
  19. import org.jivesoftware.smack.packet.Message.Type;  
  20. import org.junit.After;  
  21. import org.junit.Before;  
  22. import org.junit.Test;  
  23.   
  24. /** 
  25.  * <b>function:</b> 利用Smack框架完成 XMPP 协议通信 
  26.  * @author hoojo 
  27.  * @createDate 2012-5-22 上午10:28:18 
  28.  * @file ConnectionServerTest.java 
  29.  * @package com.hoo.smack.conn 
  30.  * @project jwchat 
  31.  * @blog http://blog.csdn.net/IBM_hoojo 
  32.  * @email hoojo_@126.com 
  33.  * @version 1.0 
  34.  */  
  35. public class SmackXMPPTest {  
  36.   
  37.     private Connection connection;  
  38.     private ConnectionConfiguration config;  
  39.     /** openfire服务器address */  
  40.     private final static String server = "192.168.8.32";  
  41.       
  42.     private final void fail(Object o) {  
  43.         if (o != null) {  
  44.             System.out.println(o);  
  45.         }  
  46.     }  
  47.       
  48.     private final void fail(Object o, Object... args) {  
  49.         if (o != null && args != null && args.length > 0) {  
  50.             String s = o.toString();  
  51.             for (int i = 0; i < args.length; i++) {  
  52.                 String item = args[i] == null ? "" : args[i].toString();  
  53.                 if (s.contains("{" + i + "}")) {  
  54.                     s = s.replace("{" + i + "}", item);  
  55.                 } else {  
  56.                     s += " " + item;  
  57.                 }  
  58.             }  
  59.             System.out.println(s);  
  60.         }  
  61.     }  
  62.       
  63.     /** 
  64.      * <b>function:</b> 初始Smack对openfire服务器链接的基本配置 
  65.      * @author hoojo 
  66.      * @createDate 2012-6-25 下午04:06:42 
  67.      */  
  68.     @Before  
  69.     public void init() {  
  70.         try {  
  71.             //connection = new XMPPConnection(server);  
  72.             //connection.connect();  
  73.               
  74.             /** 5222是openfire服务器默认的通信端口,你可以登录http://192.168.8.32:9090/到管理员控制台查看客户端到服务器端口 */  
  75.             config = new ConnectionConfiguration(server, 5222);  
  76.               
  77.             /** 是否启用压缩 */   
  78.             config.setCompressionEnabled(true);  
  79.             /** 是否启用安全验证 */  
  80.             config.setSASLAuthenticationEnabled(true);  
  81.             /** 是否启用调试 */  
  82.             config.setDebuggerEnabled(false);  
  83.             //config.setReconnectionAllowed(true);  
  84.             //config.setRosterLoadedAtLogin(true);  
  85.               
  86.             /** 创建connection链接 */  
  87.             connection = new XMPPConnection(config);  
  88.             /** 建立连接 */  
  89.             connection.connect();  
  90.         } catch (XMPPException e) {  
  91.             e.printStackTrace();  
  92.         }  
  93.         fail(connection);  
  94.         fail(connection.getConnectionID());  
  95.     }  
  96.       
  97.     @After  
  98.     public void destory() {  
  99.         if (connection != null) {  
  100.             connection.disconnect();  
  101.             connection = null;  
  102.         }  
  103.     }  
  104.       
  105.     /** 
  106.      * <b>function:</b> ConnectionConfiguration 的基本配置相关信息 
  107.      * @author hoojo 
  108.      * @createDate 2012-6-25 下午04:11:25 
  109.      */  
  110.     @Test  
  111.     public void testConfig() {  
  112.         fail("PKCS11Library: " + config.getPKCS11Library());  
  113.         fail("ServiceName: {0}", config.getServiceName());  
  114.         // ssl证书密码  
  115.         fail("TruststorePassword: {0}", config.getTruststorePassword());  
  116.         fail("TruststorePath: {0}", config.getTruststorePath());  
  117.         fail("TruststoreType: {0}", config.getTruststoreType());  
  118.           
  119.         SocketFactory socketFactory = config.getSocketFactory();  
  120.         fail("SocketFactory: {0}", socketFactory);  
  121.         /*try { 
  122.             fail("createSocket: {0}", socketFactory.createSocket("localhost", 3333)); 
  123.         } catch (IOException e) { 
  124.             e.printStackTrace(); 
  125.         }*/  
  126.     }  
  127.       
  128.     /** 
  129.      * <b>function:</b> Connection 基本方法信息 
  130.      * @author hoojo 
  131.      * @createDate 2012-6-25 下午04:12:04 
  132.      */  
  133.     @Test  
  134.     public void testConnection() {  
  135.         /** 用户管理 */  
  136.         AccountManager accountManager = connection.getAccountManager();  
  137.         for (String attr : accountManager.getAccountAttributes()) {  
  138.             fail("AccountAttribute: {0}", attr);  
  139.         }  
  140.         fail("AccountInstructions: {0}", accountManager.getAccountInstructions());  
  141.         /** 是否链接 */  
  142.         fail("isConnected:", connection.isConnected());  
  143.         fail("isAnonymous:", connection.isAnonymous());  
  144.         /** 是否有权限 */  
  145.         fail("isAuthenticated:", connection.isAuthenticated());  
  146.         fail("isSecureConnection:", connection.isSecureConnection());  
  147.         /** 是否使用压缩 */  
  148.         fail("isUsingCompression:", connection.isUsingCompression());  
  149.     }  
  150.       
  151.     /** 
  152.      * <b>function:</b> 用户管理器 
  153.      * @author hoojo 
  154.      * @createDate 2012-6-25 下午04:22:31 
  155.      */  
  156.     @Test  
  157.     public void testAccountManager() {  
  158.         AccountManager accountManager = connection.getAccountManager();  
  159.         for (String attr : accountManager.getAccountAttributes()) {  
  160.             fail("AccountAttribute: {0}", attr);  
  161.         }  
  162.         fail("AccountInstructions: {0}", accountManager.getAccountInstructions());  
  163.           
  164.         fail("supportsAccountCreation: {0}", accountManager.supportsAccountCreation());  
  165.         try {  
  166.             /** 创建一个用户boy,密码为boy;你可以在管理员控制台页面http://192.168.8.32:9090/user-summary.jsp查看用户/组的相关信息,来查看是否成功创建用户 */  
  167.             accountManager.createAccount("boy""boy");  
  168.             /** 修改密码 */  
  169.             accountManager.changePassword("abc");  
  170.         } catch (XMPPException e) {  
  171.             e.printStackTrace();  
  172.         }  
  173.     }  
  174.       
  175.     @Test  
  176.     public void testUser() {  
  177.         try {  
  178.             /** 用户登陆,用户名、密码 */  
  179.             connection.login("hoojo""hoojo");  
  180.         } catch (XMPPException e) {  
  181.             e.printStackTrace();  
  182.         }  
  183.         /** 获取当前登陆用户 */  
  184.         fail("User:", connection.getUser());  
  185.           
  186.         /** 所有用户组 */  
  187.         Roster roster = connection.getRoster();  
  188.           
  189.         /** 好友用户组,你可以用Spark添加用户好友,这样这里就可以查询到相关的数据 */  
  190.         Collection<RosterEntry> rosterEntiry = roster.getEntries();  
  191.         Iterator<RosterEntry> iter = rosterEntiry.iterator();  
  192.         while (iter.hasNext()) {  
  193.             RosterEntry entry = iter.next();  
  194.             fail("Groups: {0}, Name: {1}, Status: {2}, Type: {3}, User: {4}", entry.getGroups(), entry.getName(), entry.getStatus(), entry.getType(), entry);  
  195.         }  
  196.           
  197.         fail("-------------------------------");  
  198.         /** 未处理、验证好友,添加过的好友,没有得到对方同意 */  
  199.         Collection<RosterEntry> unfiledEntries = roster.getUnfiledEntries();  
  200.         iter = unfiledEntries.iterator();  
  201.         while (iter.hasNext()) {  
  202.             RosterEntry entry = iter.next();  
  203.             fail("Groups: {0}, Name: {1}, Status: {2}, Type: {3}, User: {4}", entry.getGroups(), entry.getName(), entry.getStatus(), entry.getType(), entry);  
  204.         }  
  205.     }  
  206.       
  207.     @Test  
  208.     @SuppressWarnings("static-access")  
  209.     public void testPacket() {  
  210.         try {  
  211.             connection.login("hoojo""hoojo");  
  212.         } catch (XMPPException e) {  
  213.             e.printStackTrace();  
  214.         }  
  215.           
  216.         //Packet packet = new Data(new DataPacketExtension("jojo@" + server, 2, "this is a message"));  
  217.         //connection.sendPacket(packet);  
  218.           
  219.         /** 更改用户状态,available=true表示在线,false表示离线,status状态签名;当你登陆后,在Spark客户端软件中就可以看到你登陆的状态 */  
  220.         Presence presence = new Presence(Presence.Type.available);  
  221.         presence.setStatus("Q我吧");  
  222.         connection.sendPacket(presence);  
  223.           
  224.         Session session = new Session();  
  225.         String sessid = session.nextID();  
  226.         connection.sendPacket(session);  
  227.         /**  
  228.          * 向jojo@192.168.8.32 发送聊天消息,此时你需要用Spark软件登陆jojo这个用户, 
  229.          * 这样代码就可以向jojo这个用户发送聊天消息,Spark登陆的jojo用户就可以接收到消息  
  230.          **/  
  231.         /** Type.chat 表示聊天,groupchat多人聊天,error错误,headline在线用户; */  
  232.         Message message = new Message("jojo@" + server, Type.chat);  
  233.         //Message message = new Message(sessid, Type.chat);  
  234.         message.setBody("h!~ jojo, I'am is hoojo!");  
  235.         connection.sendPacket(message);  
  236.           
  237.         try {  
  238.             Thread.sleep(1);  
  239.         } catch (InterruptedException e) {  
  240.             e.printStackTrace();  
  241.         }  
  242.     }  
  243.       
  244.     /** 
  245.      * <b>function:</b> 测试聊天消息管理类 
  246.      * @author hoojo 
  247.      * @createDate 2012-6-25 下午05:03:23 
  248.      */  
  249.     @Test  
  250.     public void testChatManager() {  
  251.         /** 设置状态 */  
  252.         try {  
  253.             connection.login("hoojo""hoojo");  
  254.         } catch (XMPPException e) {  
  255.             e.printStackTrace();  
  256.         }  
  257.           
  258.         /** 设置状态 */  
  259.         Presence presence = new Presence(Presence.Type.available);  
  260.         presence.setStatus("Q我吧");  
  261.         connection.sendPacket(presence);  
  262.           
  263.         /** 获取当前登陆用户的聊天管理器 */  
  264.         ChatManager chatManager = connection.getChatManager();  
  265.         /** 为指定用户创建一个chat,MyMessageListeners用于监听对方发过来的消息  */  
  266.         Chat chat = chatManager.createChat("jojo@" + server, new MyMessageListeners());  
  267.         try {  
  268.             /** 发送消息 */  
  269.             chat.sendMessage("h!~ jojo……");  
  270.               
  271.             /** 用message对象发送消息 */  
  272.             Message message = new Message();  
  273.             message.setBody("message");  
  274.             message.setProperty("color""red");  
  275.             chat.sendMessage(message);  
  276.         } catch (XMPPException e) {  
  277.             e.printStackTrace();  
  278.         }  
  279.         try {  
  280.             Thread.sleep(1000 * 1000);  
  281.         } catch (InterruptedException e) {  
  282.             e.printStackTrace();  
  283.         }  
  284.     }  
  285.       
  286.     /** 
  287.      * <b>function:</b> 消息监听器,用户监听对方发送的消息,也可以想对方发送消息 
  288.      * @author hoojo 
  289.      * @createDate 2012-6-25 下午05:05:31 
  290.      * @file SmackXMPPTest.java 
  291.      * @package com.hoo.smack 
  292.      * @project jwchat 
  293.      * @blog http://blog.csdn.net/IBM_hoojo 
  294.      * @email hoojo_@126.com 
  295.      * @version 1.0 
  296.      */  
  297.     class MyMessageListeners implements MessageListener {  
  298.         public void processMessage(Chat chat, Message message) {  
  299.             try {  
  300.                 /** 发送消息 */  
  301.                 chat.sendMessage("dingding……" + message.getBody());  
  302.             } catch (XMPPException e) {  
  303.                 e.printStackTrace();  
  304.             }  
  305.             /** 接收消息 */  
  306.             fail("From: {0}, To: {1}, Type: {2}, Sub: {3}", message.getFrom(), message.getTo(), message.getType(), message.toXML());  
  307.             /*Collection<Body> bodys =  message.getBodies(); 
  308.             for (Body body : bodys) { 
  309.                 fail("bodies[{0}]", body.getMessage()); 
  310.             } 
  311.             //fail(message.getLanguage()); 
  312.             //fail(message.getThread()); 
  313.             //fail(message.getXmlns());*/  
  314.             fail("body: ", message.getBody());  
  315.         }  
  316.     }  
  317. }  


这篇关于Smack 结合 Openfire服务器,建立IM通信,发送聊天消息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1079756

相关文章

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

Ubuntu 22.04 服务器安装部署(nginx+postgresql)

《Ubuntu22.04服务器安装部署(nginx+postgresql)》Ubuntu22.04LTS是迄今为止最好的Ubuntu版本之一,很多linux的应用服务器都是选择的这个版本... 目录是什么让 Ubuntu 22.04 LTS 变得安全?更新了安全包linux 内核改进一、部署环境二、安装系统

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

nginx配置多域名共用服务器80端口

《nginx配置多域名共用服务器80端口》本文主要介绍了配置Nginx.conf文件,使得同一台服务器上的服务程序能够根据域名分发到相应的端口进行处理,从而实现用户通过abc.com或xyz.com直... 多个域名,比如两个域名,这两个域名其实共用一台服务器(意味着域名解析到同一个IP),一个域名为abc

springboot rocketmq配置生产者和消息者的步骤

《springbootrocketmq配置生产者和消息者的步骤》本文介绍了如何在SpringBoot中集成RocketMQ,包括添加依赖、配置application.yml、创建生产者和消费者,并展... 目录1. 添加依赖2. 配置application.yml3. 创建生产者4. 创建消费者5. 使用在

pycharm远程连接服务器运行pytorch的过程详解

《pycharm远程连接服务器运行pytorch的过程详解》:本文主要介绍在Linux环境下使用Anaconda管理不同版本的Python环境,并通过PyCharm远程连接服务器来运行PyTorc... 目录linux部署pytorch背景介绍Anaconda安装Linux安装pytorch虚拟环境安装cu

MySQL 中的服务器配置和状态详解(MySQL Server Configuration and Status)

《MySQL中的服务器配置和状态详解(MySQLServerConfigurationandStatus)》MySQL服务器配置和状态设置包括服务器选项、系统变量和状态变量三个方面,可以通过... 目录mysql 之服务器配置和状态1 MySQL 架构和性能优化1.1 服务器配置和状态1.1.1 服务器选项

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块