openfire+smack4.2.3
https://blog.csdn.net/qq_36020545/article/details/80802300
在学习openfire中
其中openfire向我们这种初学者最好不要更改底层代码和进行增加自己的插件,在刚开始学习的过程中可以下了解 xmpp协议
我这边使用java实现smack 和openfire 的联动,再和spark进行联调沟通.
我在这里使用的linux的openfire环境,配置的端口都是默认的
使用的是mysql数据库不过在我们写客户端或者api 接口的时候是不用连接openfire数据库的,所以我们服务器在写业务服务器的时候可以在链接自己的数据库,我们和openfire沟通的时候是按照xmpp协议
这个是smack的使用api英文版 生肉啊
http://download.igniterealtime.org/smack/docs/latest/javadoc/index.html?overview-summary.html
这个是openfire官网
http://www.igniterealtime.org/downloads/index.jsp
下面直接上代码
这个是smackUtil 使用smack4.2.3
package com.tsingning.im.smack;
import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.chat2.Chat;
import org.jivesoftware.smack.chat2.ChatManager;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
import org.jivesoftware.smackx.iqregister.AccountManager;
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.Localpart;
import org.jxmpp.jid.parts.Resourcepart;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@Component
public class SmackUtil {
/**openfire admin 账号*/
@Value("openfire.admin.username")
private static String ADMIN_USERNAME;
/**openfire admin 密码*/
@Value("openfire.admin.password")
private static String ADMIN_PASSWORD;
/**openfire system 账号*/
@Value("openfire.system.username")
private static String SYSTEM_USERNAME;
/**openfire system 密码*/
@Value("openfire.system.password")
private static String SYSTEM_PASSWORD;
/**openfire 域*/
@Value("openfire.domain")
private static String OPENFIRE_DOMAIN;
/**openfire ip*/
@Value("openfire.host")
private static String OPENFIRE_HOST;
/**openfire ip*/
@Value("openfire.port")
private static int OPENFIRE_PORT;
public static GroupMessageListener groupMessageListener = new GroupMessageListener();
public static InChatMessageListener inChatMessageListener = new InChatMessageListener();
private static AbstractXMPPConnection adminConnection = null;
public static AbstractXMPPConnection getAdminConnection(){
if(adminConnection == null){
synchronized (SmackUtil.class){
if(adminConnection == null){
try {
adminConnection = getUserConnection(ADMIN_USERNAME,ADMIN_PASSWORD);
adminConnection.connect();
adminConnection.login();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
return adminConnection;
}
private static AbstractXMPPConnection systemConnection = null;
public static AbstractXMPPConnection getSystemConnection(){
if(systemConnection == null){
synchronized (SmackUtil.class){
if(systemConnection == null){
try {
systemConnection = getUserConnection(SYSTEM_USERNAME,SYSTEM_PASSWORD);
systemConnection.connect();
systemConnection.login();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
return systemConnection;
}
/**
* 用户登录链接通道
* @return
*/
public static AbstractXMPPConnection getUserConnection(String username, String password) throws Exception {
XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder();
builder.setUsernameAndPassword(username,password);
builder.setXmppDomain(OPENFIRE_DOMAIN);
builder.setHost(OPENFIRE_HOST);
builder.setPort(OPENFIRE_PORT);
builder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
builder.setDebuggerEnabled(true);
XMPPTCPConnectionConfiguration config = builder.build();
AbstractXMPPConnection c = new XMPPTCPConnection(config);
return c;
}
/**
* 注册用户
* @param username 用户登录账号
* @param password 用户登录密码
*/
public static boolean resgisterUser(String username,String password) throws Exception {
try{
//附加信息
HashMap<String, String> attributes =new HashMap<String, String>();
attributes.put("name",username);
AccountManager.sensitiveOperationOverInsecureConnectionDefault(true);
Localpart usernameL = Localpart.from(username);
AccountManager.getInstance(getAdminConnection()).
createAccount(usernameL,password,attributes);
return true;
}catch (Exception e){
return false;
}
}
/**
* 发消息
* @param type 消息类型
* @param subject 消息头
* @param user 目标
* @param body 消息
* @throws Exception
*/
public static void sendUserMsg(Message.Type type, String subject, String user, String body) throws Exception {
ChatManager chatManager = ChatManager.getInstanceFor(getAdminConnection());
// chatManager.addIncomingListener(inChatMessageListener);
EntityBareJid groupJid = JidCreate.entityBareFrom(user);
Chat chat = chatManager.chatWith(groupJid);
Message msg = new Message();
msg.setType(type);
msg.setSubject(subject);
msg.setBody(body);
chat.send(msg);
}
/**
* 创建群聊房间
* @param groupname 群名称
* @param roomname 群昵称
* @param usernames 群的所有人
* @return
* @throws Exception
*/
public static MultiUserChat createChatRoom(String usernmae, String passowrd, String groupname, String roomname, List<String> usernames) throws Exception {
String jid = groupname + "@conference." + getSystemConnection().getServiceName();
EntityBareJid groupJid = JidCreate.entityBareFrom(jid);
MultiUserChat muc = MultiUserChatManager.getInstanceFor(getSystemConnection()).getMultiUserChat(groupJid);
//设置群组名称
muc.create(Resourcepart.from(roomname));
// 设置聊天室的成员
List<String> owners = new ArrayList<String>();
owners.add(getSystemConnection().getUser()+"");
/**XMPP会议室设置MUC*/
// 获得聊天室的配置表单 根据原始表单创建一个要提交的新表单。
Form form = muc.getConfigurationForm();
Form submitForm = form.createAnswerForm();
//房间名称
submitForm.setAnswer("muc#roomconfig_roomname",roomname);
//房间描述
submitForm.setAnswer("muc#roomconfig_roomdesc","家庭圈");
// //房间拥有者
submitForm.setAnswer("muc#roomconfig_roomowners", owners);
//房间管理员
final List<String> admins = new ArrayList<String>();
admins.add(getAdminConnection().getUser()+"");
submitForm.setAnswer("muc#roomconfig_roomadmins", admins);
//房间最大人数
final List<String> maxusers = new ArrayList<String>();
maxusers.add("50");
submitForm.setAnswer("muc#roomconfig_maxusers", maxusers);
//设置为公共房间
submitForm.setAnswer("muc#roomconfig_publicroom", true);
// 设置聊天室是持久聊天室
submitForm.setAnswer("muc#roomconfig_persistentroom", true);
//房间是适度的
submitForm.setAnswer("muc#roomconfig_moderatedroom",true);
// 房间仅对成员开放
submitForm.setAnswer("muc#roomconfig_membersonly", false);
// 允许占有者邀请其他人
submitForm.setAnswer("muc#roomconfig_allowinvites", true);
//允许占有者更改主题
submitForm.setAnswer("muc#roomconfig_changesubject", false);
// 登录房间对话
submitForm.setAnswer("muc#roomconfig_enablelogging", true);
//进入不需要密码
submitForm.setAnswer("muc#roomconfig_passwordprotectedroom", false);
// 仅允许注册的昵称登录
submitForm.setAnswer("x-muc#roomconfig_reservednick", true);
// 允许使用者修改昵称
submitForm.setAnswer("x-muc#roomconfig_canchangenick", false);
// 允许用户注册房间
submitForm.setAnswer("x-muc#roomconfig_registration", true);
// 发送已完成的表单(有默认值)到服务器来配置聊天室
muc.sendConfigurationForm(submitForm);
//添加群消息监听
muc.addMessageListener(groupMessageListener);
return muc;
}
/**
* 加入群聊会议室
* @param groupName 聊天室名称
* @return
* @throws Exception
*/
public static MultiUserChat joinMultiUserChat(String groupName,String nickname) throws Exception {
//群jid
String jid = groupName + "@conference." + getSystemConnection().getServiceName();
//jid实体创建
EntityBareJid groupJid = JidCreate.entityBareFrom(jid);
//获取群管理对象
MultiUserChatManager multiUserChatManager = MultiUserChatManager.getInstanceFor( getSystemConnection());
//通过群管理对象获取该群房间对象
MultiUserChat multiUserChat = multiUserChatManager.getMultiUserChat(groupJid);
Resourcepart from = Resourcepart.from(nickname);
MucEnterConfiguration.Builder builder = multiUserChat.getEnterConfigurationBuilder(from);
builder.requestMaxCharsHistory(0);
MucEnterConfiguration mucEnterConfiguration = builder.build();
// 加入群
multiUserChat.join(mucEnterConfiguration);
return multiUserChat;
}
/**
* 发送群聊消息
* @param groupName
* @param body
*/
public static void sendChatGroupMessage(String groupName, String body) throws Exception {
MultiUserChat multiUserChat = joinMultiUserChat(groupName, getSystemConnection().getUser().toString());
Message message = new Message();
message.setBody(body);
message.setType(Message.Type.groupchat);
//发送信息
multiUserChat.sendMessage(message);
//下线
multiUserChat.leave();
}
}
在这里我增加了两个监听文件
这个是消息监听
package com.tsingning.im.smack;
import org.jivesoftware.smack.chat2.Chat;
import org.jivesoftware.smack.chat2.IncomingChatMessageListener;
import org.jivesoftware.smack.packet.Message;
import org.jxmpp.jid.EntityBareJid;
/**
* 接收消息监听器
* Created by ozy on 2017/4/11.
*/
public class InChatMessageListener implements IncomingChatMessageListener {
@Override
public void newIncomingMessage(EntityBareJid from, Message message, Chat chat) {
//from就是消息的发送方的jid,message即发送的消息对象,chat也就是单聊对象
//获取from发送方的账号,转换成string即可
System.out.println("发信人:" +from.toString()+",body:"+message.getBody());
}
}
这个是群聊监听
package com.tsingning.im.smack;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.packet.Message;
import org.jxmpp.jid.Jid;
public class GroupMessageListener implements MessageListener {
@Override
public void processMessage(Message message) {
Jid from = message.getFrom();
String body = message.getBody();
System.out.println("jid:"+from+",body:"+body);
}
}
下面是pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>open-fire-demo</groupId>
<artifactId>open-fire-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>6</source>
<target>6</target>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<smack.version>4.2.3</smack.version>
</properties>
<dependencies>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-core</artifactId>
<version>${smack.version}</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-java7</artifactId>
<version>${smack.version}</version>
<exclusions>
<exclusion>
<groupId>xpp3</groupId>
<artifactId>xpp3</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>xpp3</groupId>
<artifactId>xpp3</artifactId>
<version>1.1.3.4.O</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-tcp</artifactId>
<version>${smack.version}</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-im</artifactId>
<version>${smack.version}</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-extensions</artifactId>
<version>${smack.version}</version>
</dependency>
<dependency>
<groupId>org.jxmpp</groupId>
<artifactId>jxmpp-jid</artifactId>
<version>0.6.0</version>
</dependency>
</dependencies>
</project>