第一步:

在pom.xml文件中,引入依赖项

    <dependency><groupId>org.igniterealtime.smack</groupId><artifactId>smack-core</artifactId><version>4.3.4</version></dependency><dependency><groupId>org.igniterealtime.smack</groupId><artifactId>smack-extensions</artifactId><version>4.3.4</version></dependency><dependency><groupId>org.igniterealtime.smack</groupId><artifactId>smack-tcp</artifactId><version>4.3.4</version></dependency><dependency><groupId>org.igniterealtime.smack</groupId><artifactId>smack-java7</artifactId><version>4.3.4</version></dependency>

第二步:

IM登录,创建群聊、加入群聊、发送消息、退出群聊模块代码编写

package com.eddue;import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode;
import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.SmackException.NotConnectedException;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.chat2.Chat;
import org.jivesoftware.smack.chat2.ChatManager;
import org.jivesoftware.smack.chat2.IncomingChatMessageListener;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
import org.jivesoftware.smackx.muc.MucEnterConfiguration;
import org.jivesoftware.smackx.muc.MultiUserChat;
import org.jivesoftware.smackx.muc.MultiUserChatManager;
import org.jivesoftware.smackx.xdata.Form;
import org.jxmpp.jid.EntityBareJid;
import org.jxmpp.jid.impl.JidCreate;
import org.jxmpp.jid.parts.Resourcepart;
import org.jxmpp.stringprep.XmppStringprepException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class Test {private static XMPPTCPConnectionConfiguration config;private static XMPPTCPConnection conn;static {try {config = XMPPTCPConnectionConfiguration.builder().setXmppDomain("192.168.0.229").setHost("192.168.0.229").setPort(5222).setDebuggerFactory(SmackConfiguration.getDefaultSmackDebuggerFactory()).setSecurityMode(SecurityMode.disabled).build();conn = new XMPPTCPConnection(config);conn.connect();} catch (Exception e) {e.printStackTrace();}}public static void login(String username,String password){try {if(conn!=null){conn.login(username, password);System.out.println("user "+username+" login successfully.");}} catch (XMPPException e) {e.printStackTrace();} catch (SmackException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}@SuppressWarnings("deprecation")public static void sendMessage(String username,String password,String msg){//先登录login(username, password);//再构建聊天室ChatManager cm = ChatManager.getInstanceFor(conn);cm.addIncomingListener(new IncomingChatMessageListener() {@Overridepublic void newIncomingMessage(EntityBareJid from, Message message, Chat chat) {System.out.println("message from : "+from+" : "+message.getBody());}});try {EntityBareJid jid = JidCreate.entityBareFrom("smack@192.168.0.229");Chat chat = cm.chatWith(jid);Message message = new Message();message.setBody(msg);chat.send(message);while (true){}} catch (XmppStringprepException e) {e.printStackTrace();} catch (NotConnectedException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}/*** 创建群聊房间* @param groupName 群名称* @param users 创建群完成后添加的群成员* @param groupNickName 群昵称* @return*/public static MultiUserChat createChatRoom(String groupName, List<User> users, String groupNickName) throws Exception {//组装群聊jid,这里需要注意一下,群jid的格式就是  群名称@conference.openfire服务器名称String jid = groupName + "@conference." + "192.168.0.229";EntityBareJid groupJid = JidCreate.entityBareFrom(jid);MultiUserChatManager multiUserChatManager = MultiUserChatManager.getInstanceFor(conn);MultiUserChat muc = multiUserChatManager.getMultiUserChat(groupJid);muc.create(Resourcepart.from(groupNickName));// 获得聊天室的配置表单Form form = muc.getConfigurationForm();// 根据原始表单创建一个要提交的新表单。Form submitForm = form.createAnswerForm();// 设置聊天室的新拥有者List<String> owners = new ArrayList<>();owners.add("admin"+ "@" + "192.168.0.229");//这里的用户实体我要说一下,因为这是我这个项目的实体,实际上这里只需要知道用户的jid获者名称就可以了if(users != null && !users.isEmpty()) {for (int i = 0; i < users.size(); i++){  //添加群成员,用户jid格式和之前一样 用户名@openfire服务器名称EntityBareJid userJid = JidCreate.entityBareFrom(users.get(i).getUsername() + "@" +"192.168.0.229");owners.add(userJid + "");}}submitForm.setAnswer("muc#roomconfig_roomowners", owners);//设置为公共房间submitForm.setAnswer("muc#roomconfig_publicroom", true);// 设置聊天室是持久聊天室,即将要被保存下来submitForm.setAnswer("muc#roomconfig_persistentroom", true);// 房间仅对成员开放submitForm.setAnswer("muc#roomconfig_membersonly", false);// 允许占有者邀请其他人submitForm.setAnswer("muc#roomconfig_allowinvites", true);//进入不需要密码submitForm.setAnswer("muc#roomconfig_passwordprotectedroom",  false);// 能够发现占有者真实 JID 的角色// submitForm.setAnswer("muc#roomconfig_whois", "anyone");// 登录房间对话submitForm.setAnswer("muc#roomconfig_enablelogging", true);// 仅允许注册的昵称登录submitForm.setAnswer("x-muc#roomconfig_reservednick", false);// 允许使用者修改昵称submitForm.setAnswer("x-muc#roomconfig_canchangenick", true);// 允许用户注册房间submitForm.setAnswer("x-muc#roomconfig_registration", false);// 发送已完成的表单(有默认值)到服务器来配置聊天室muc.sendConfigurationForm(submitForm);//添加群消息监听muc.addMessageListener(new InGroupChatMessageListener(jid));return muc;}/*** 发送群聊普通消息* @param groupName* @param body*/public static void sendChatGroupMessage(String groupName, String body) throws Exception {//拼凑jidString jid = groupName + "@conference." + "192.168.0.229";//创建jid实体EntityBareJid groupJid = JidCreate.entityBareFrom(jid);//群管理对象MultiUserChatManager multiUserChatManager = MultiUserChatManager.getInstanceFor(conn);MultiUserChat multiUserChat = multiUserChatManager.getMultiUserChat(groupJid);//发送信息multiUserChat.sendMessage(body);}/*** 加入群聊会议室* @param groupName* @param nickName* @return* @throws Exception*/public static MultiUserChat joinMultiUserChat(String groupName, String nickName) throws Exception {//群jidString jid = groupName + "@conference." + "192.168.0.229";//jid实体创建EntityBareJid groupJid = JidCreate.entityBareFrom(jid);//获取群管理对象MultiUserChatManager multiUserChatManager = MultiUserChatManager.getInstanceFor(conn);//通过群管理对象获取该群房间对象MultiUserChat multiUserChat = multiUserChatManager.getMultiUserChat(groupJid);MucEnterConfiguration.Builder builder = multiUserChat.getEnterConfigurationBuilder(Resourcepart.from(nickName));//只获取最后99条历史记录builder.requestMaxCharsHistory(99);MucEnterConfiguration mucEnterConfiguration = builder.build();//加入群multiUserChat.join(mucEnterConfiguration);return multiUserChat;}/*** 退出群聊* @param groupName* @throws XmppStringprepException*/public static void quitRoom(String groupName) throws Exception {String jid = groupName + "@conference." + "192.168.0.229";EntityBareJid groupJid = JidCreate.entityBareFrom(jid);MultiUserChatManager multiUserChatManager = MultiUserChatManager.getInstanceFor(conn);MultiUserChat multiUserChat = multiUserChatManager.getMultiUserChat(groupJid);//退出群multiUserChat.leave();}public static void main( String[] args ) throws Exception{
//        sendMessage("openfire", "123456", "hello,smack 1111");
//        List<User> list = new ArrayList<>();
//        User user = new User();
//        user.setUsername("openfire");
//        list.add(user);
//        login("admin", "123456");createChatRoom("test2", list, "测试群");
//        sendChatGroupMessage("test2", "hello world");login("smack", "123456");joinMultiUserChat("test2", "haha");sendChatGroupMessage("test2", "hello world2");quitRoom("test2");sendChatGroupMessage("test2", "hello world3");System.in.read();}
}

第三步:

编写群消息IM监听器代码

package com.eddue;import org.jivesoftware.smack.*;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
import org.jivesoftware.smackx.muc.MultiUserChat;
import org.jivesoftware.smackx.muc.MultiUserChatManager;
import org.jxmpp.jid.EntityBareJid;
import org.jxmpp.jid.impl.JidCreate;
import org.jxmpp.stringprep.XmppStringprepException;/*** @author zzx* @Description TODO* @company www.eddue.com* @since 2019/8/5 10:58*/
public class InGroupChatMessageListener implements MessageListener {private static XMPPTCPConnectionConfiguration config;private static AbstractXMPPConnection conn;private String jid;public InGroupChatMessageListener(String jid) {this.jid = jid;}static {try {config = XMPPTCPConnectionConfiguration.builder().setXmppDomain("192.168.0.229").setHost("192.168.0.229").setPort(5222).setDebuggerFactory(SmackConfiguration.getDefaultSmackDebuggerFactory()).setSecurityMode(ConnectionConfiguration.SecurityMode.disabled).build();conn = new XMPPTCPConnection(config);conn.connect();} catch (Exception e) {e.printStackTrace();}}@Overridepublic void processMessage(Message message) {try {//创建jid实体EntityBareJid groupJid = JidCreate.entityBareFrom(jid);//群管理对象MultiUserChatManager multiUserChatManager = MultiUserChatManager.getInstanceFor(conn);MultiUserChat multiUserChat = multiUserChatManager.getMultiUserChat(groupJid);//发送信息multiUserChat.sendMessage(message);} catch (SmackException.NotConnectedException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();} catch (XmppStringprepException e) {e.printStackTrace();}}}

第四步:

创建一个用户对象

package com.eddue;/*** @author zzx* @Description TODO* @company www.eddue.com* @since 2019/8/5 11:33*/
public class User {private String username;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}
}

第五步:

使用Spark工具,测试群聊功能是否ok

转载于:https://my.oschina.net/u/1017791/blog/3083654

smack+openfire创建IM群聊、加入群聊、发送消息、退出群聊(openfire学习记录二)...相关推荐

  1. SAP ABAP 添加企业微信群机器人并调用 API 发送消息

    SAP ABAP 添加企业微信群机器人并调用 API 发送消息 引言: 这篇文章以我在个人开源项目"任务管理服务(ZTASK)"中的应用为例,通过讲述使用企业微信机器人实现任务的通 ...

  2. python request模块 在钉钉中创建群聊机器人,一键发送消息,定时发送(详细步骤)

    0.安装requests模块 Linux下执行 pip3 install requests 1.request简介 Reqest是Python的HTTP库,内部采用urillib3模块,但是用起来比u ...

  3. [大数据技术与应用省赛学习记录二]——模块一(HADOOP完全分布式集群搭建)

    **在操作前,先梳理一下HADOOP完全分布式需要做些什么,不然像无头的苍蝇一样,永远不知道做什么.因为我本人比赛是一台服务器Centos 7,与三台客户端Ubuntu 18.04,所以以物理机的角度 ...

  4. 【Android WebSocket】Android 端 WebSocket 基本用法 ( 添加依赖和权限 | 创建 WebSocketClient 客户端类 | 建立连接并发送消息 )

    文章目录 一.添加依赖和权限 二.创建 WebSocketClient 客户端类 三.建立连接并发送消息 使用 https://github.com/TooTallNate/Java-WebSocke ...

  5. 查看当前服务器中的所有的topic,创建topic,删除topic,通过shell命令发送消息,通过shell消费消息,查看topic详情,对分区数进行修改

    一. Kafka常用操作命令  查看当前服务器中的所有topic [root@hadoop3 kafka]# bin/kafka-topics.sh --list --zookeeper hadoo ...

  6. SpringBoot集成Kafka集群并实现接收_发送消息操作_以及常见错误_亲测---Kafka工作笔记005

    1.注意这个过程中,很重要的是:版本,springboot的版本和spring-kafka的版本要对应起来. 2.我现在发现两个版本是没问题的,一会说明 3.还要注意yml资源文件,或者propert ...

  7. python微信群发_更新新年祝福群发!小白转战Python微信定时发送消息给群或是个人!...

    本帖最后由 新手小白学编程 于 2020-1-24 21:07 编辑 {:301_998:} 过年了发点祝福短信发现人太多了,老代码改一改直接定时群发走起! [Python] 纯文本查看 复制代码im ...

  8. 高可用mongodb集群的学习记录(二mongodb主从配置)

    二mongodb主从配置 在之前我们使用mysql数据库或者redis时大家广泛用到,采用双机备份后主节点挂掉了后从节点可以接替主机继续服务.所以这种模式比单节点的高可用性要好很多. 1.环境准备 实 ...

  9. telegram协议电报群组采集,群用户提取,私发消息,群拉人,关键词监控回复等引流自动化

    稳定更新 tg: @AllenHi

最新文章

  1. Apache Cordova-Android框架原理研究笔记
  2. oracle查看执行最慢与查询次数最多的sql语句及其执行速度很慢的问题分析
  3. 45度炸队Alpha冲刺博客集
  4. Java并发控制基础篇 Thread继承类和Runnable实现类
  5. django-xadmin使用之更改菜单url
  6. C程序对整数中设置为1的位数进行计数
  7. 证券基金行业IT运维“远景”如何应对?
  8. 同步电脑与手机,让手机变身无线Modem
  9. c/c++教程 - 2.4.2.5 深拷贝和浅拷贝,堆区内存重复释放
  10. python软件下载3版本-Python软件下载-Python最新版 v3.7.3 - 动力软件园
  11. 3d数字孪生工厂可视化三维建模平台
  12. ccfcsp-20190301小中大-JAVA语言
  13. Vue项目 在chrome页面崩溃:喔唷 崩溃了(总结)
  14. 《别做正常的傻瓜》的一些读书心得
  15. 英特尔2018年处理器一览
  16. mssql和mysql注入区别_Mssql手工注入小结
  17. YTU 3413: 小姬小姬小姬
  18. 淘宝接口调用,面向对象
  19. MSRA被曝停招国防七子及北邮学生!
  20. 为什么要制定企业标准

热门文章

  1. MyBatis Plus多表联查方法
  2. 2.8 填充工具的使用 [Ps教程]
  3. 盘点:2017年备受关注的20家企业级服务公司
  4. CSS基础语法与选择器扫盲
  5. 如何恢复被删短信_恢复iPhone短信的两种简单方法推荐
  6. 人工智能跟脑神经科学没有关系。没有出差错的机会,就没有进化的可能。要想自己把事情做成功,就需要弄清楚事物的本质。...
  7. 麦当劳理论-打破第一层壁垒
  8. 一个成功传递引用类型参数到非托管环境的例子
  9. Python文件格式转换
  10. 我认识php的前世今生