openfire+smack4.2.3

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>

猜你喜欢

转载自blog.csdn.net/w690333243/article/details/81701747