Openfire即时通讯服务搭建与Smack访问

Openfire 是开源的、基于可拓展通讯和表示协议(XMPP)、采用Java编程语言开发的实时协作服务器。 Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器可支持上万并发用户。

首先到openfire官网上去下载Openfire的服务器包与Smack的客户端调用包。

http://www.igniterealtime.org/projects/index.jsp

打开后在这里可以看到有Openfire,Spark,Smack这三个东西,我简单解释一下它们分别是什么,Openfire是跑在服务器的,Spark与Smack是跑在客户机上的,而Spark是已经构建好的应用程序,下载下来安装即可使用(看下面的截图),Smack是提供访问Openfire的调用接口,就是做开发写代码的啦。

Openfire下载后,如果是win的版本,那么它是一个exe的安装包,运行下一步下一步即可,其间会需要配置数据库(Openfire当然是需要数据库支持的了,比如要存帐号等等的信息)。具体可以参照这个 http://jingyan.baidu.com/article/2c8c281df16ad30008252ae4.html

Openfire安装成功后,下载Smack的包,里边包含有相应接口的jar包,导入到我们的工程里(不同版本的smack
jar可能会不太一样)

编写我们的程序访问Operfire

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.ChatManagerListener;
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;

public class SmackUtil {

    private Connection connection;
    private ConnectionConfiguration config;
    /** openfire服务器address */
    private final static String server = "10.100.53.65";

    private final void print(Object o) {
        if (o != null) {
            System.out.println(o);
        }
    }

    private final void print(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);
        }
    }

    /**
     * 初始Smack对openfire服务器链接的基本配置
     */
    public void init() {
        try {
            //connection = new XMPPConnection(server);
            //connection.connect();
            /** 5222是openfire服务器默认的通信端口,你可以登录http://10.100.53.65: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();
            System.out.println("connection success");
        } catch (XMPPException e) {
            e.printStackTrace();
        }
        print(connection);
        print(connection.getConnectionID());
    }

    public void destory() {
        if (connection != null) {
            connection.disconnect();
            connection = null;
        }
    }

    /**
     * ConnectionConfiguration 的基本配置相关信息
     */
    public void seeConfig() {
        print("PKCS11Library: " + config.getPKCS11Library());
        print("ServiceName: {0}", config.getServiceName());
        // ssl证书密码
        print("TruststorePassword: {0}", config.getTruststorePassword());
        print("TruststorePath: {0}", config.getTruststorePath());
        print("TruststoreType: {0}", config.getTruststoreType());

        SocketFactory socketFactory = config.getSocketFactory();
        print("SocketFactory: {0}", socketFactory);
    }

    /**
     * Connection 基本方法信息
     */
    public void seeConnection() {
        /** 用户管理 */
        AccountManager accountManager = connection.getAccountManager();
        for (String attr : accountManager.getAccountAttributes()) {
            print("AccountAttribute: {0}", attr);
        }
        print("AccountInstructions: {0}", accountManager.getAccountInstructions());
        /** 是否链接 */
        print("isConnected:", connection.isConnected());
        print("isAnonymous:", connection.isAnonymous());
        /** 是否有权限 */
        print("isAuthenticated:", connection.isAuthenticated());
        print("isSecureConnection:", connection.isSecureConnection());
        /** 是否使用压缩 */
        print("isUsingCompression:", connection.isUsingCompression());
    }

    /**
     * 创建用户
     * @param username
     * @param password
     */
    public void createUser(String username, String password){
    	AccountManager accountManager = connection.getAccountManager();
    	try {
    		/** 创建一个用户;你可以在管理员控制台页面http://10.100.53.65:9090/user-summary.jsp查看用户/组的相关信息,来查看是否成功创建用户 */
    		accountManager.createAccount(username, password);
    		/** 修改密码 */
    		accountManager.changePassword("abc");
    	} catch (XMPPException e) {
    		e.printStackTrace();
    	}
    }

    /**
     * 修改密码
     * @param username
     * @param password
     */
    public void changePassword(String password){
    	AccountManager accountManager = connection.getAccountManager();
    	try {
    		/** 修改密码 */
    		accountManager.changePassword("123456");
    	} catch (XMPPException e) {
    		e.printStackTrace();
    	}
    }

    /**
     * 用户登陆
     * @param username
     * @param password
     */
    public void login(String username, String password) {
        try {
            /** 用户登陆,用户名、密码 */
            connection.login(username, password);
        } catch (XMPPException e) {
            e.printStackTrace();
        }
        /** 获取当前登陆用户 */
        print("User:", connection.getUser());

        /** 所有用户组 */
        Roster roster = connection.getRoster();

       /* try {
			roster.createEntry("test55", "test55", null);//添加好友,不添加成为好友也同样可以收发信息
		} catch (XMPPException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}*/

        /** 好友用户组,你可以用Spark添加用户好友,这样这里就可以查询到相关的数据 */
        Collection<RosterEntry> rosterEntiry = roster.getEntries();
        Iterator<RosterEntry> iter = rosterEntiry.iterator();
        while (iter.hasNext()) {
            RosterEntry entry = iter.next();
            print("Groups: {0}, Name: {1}, Status: {2}, Type: {3}, User: {4}", entry.getGroups(), entry.getName(), entry.getStatus(), entry.getType(), entry);
        }

        print("-------------------------------");
        /** 未处理、验证好友,添加过的好友,没有得到对方同意 */
        Collection<RosterEntry> unfiledEntries = roster.getUnfiledEntries();
        iter = unfiledEntries.iterator();
        while (iter.hasNext()) {
            RosterEntry entry = iter.next();
            print("Groups: {0}, Name: {1}, Status: {2}, Type: {3}, User: {4}", entry.getGroups(), entry.getName(), entry.getStatus(), entry.getType(), entry);
        }
    }

    /**
     * 添加消息监听器
     */
    public void addMsgListener(){
    	//监听接收到的消息
    	connection.getChatManager().addChatListener(new ChatManagerListener() {	//可以监听到所有用户发来的消息
    		@Override
    		public void chatCreated(Chat chat, boolean createdLocally) {
    			chat.addMessageListener(new MessageListener() {
    				public void processMessage(Chat chat, Message message) {
    					//String from = message.getFrom();
    					//String body =  message.getBody();
    					System.out.println("body:"+message.getBody());

    				}
    			});
    		}
    	});
    }

    /**
     * Packet消息聊天
     * @param from
     * @param to
     * @param msg
     */
    public void sendPacketMsg(String from, String to, String msg) {
//        try {
//            connection.login(from, from);
//        } catch (XMPPException e) {
//            e.printStackTrace();
//        }

        /** 更改用户状态,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);
        Message message = new Message(to+"@" + server, Type.chat);
        //Message message = new Message(sessid, Type.chat);
        message.setBody(msg);
        connection.sendPacket(message);
    }

    /**
     * Chat消息聊天
     * @param from
     * @param to
     * @param msg
     */
    public void sendChatMsg(String from, String to, String msg) {
        /** 设置状态 */
//        try {
//            connection.login(from, from);
//        } catch (XMPPException e) {
//            e.printStackTrace();
//        }

        /** 设置状态 */
        Presence presence = new Presence(Presence.Type.available);
        presence.setStatus("Q我吧");
        connection.sendPacket(presence);

        /** 获取当前登陆用户的聊天管理器 */
        ChatManager chatManager = connection.getChatManager();
        /** 为指定用户创建一个chat,监听对方发过来的消息  */
        Chat chat = chatManager.createChat(to+"@" + server, new MessageListener() {//仅监听该用户发来的消息

			@Override
			public void processMessage(Chat chat, Message message) {
				System.out.println("body:"+message.getBody());
			}
		});
        try {
            /** 发送消息 */
            chat.sendMessage(msg);

            /** 用message对象发送消息 */
//            Message message = new Message();
//            message.setBody("message");
//            message.setProperty("color", "red");
//            chat.sendMessage(message);
        } catch (XMPPException e) {
            e.printStackTrace();
        }
    }

}

创建两个通讯的测试帐号

public static void main(String[] args) {
		SmackUtil smackUtil = new SmackUtil();

		smackUtil.init();
		smackUtil.seeConfig();
		smackUtil.seeConnection();

		smackUtil.createUser("test1", "test1");	

	}
public static void main(String[] args) {
		SmackUtil smackUtil = new SmackUtil();

		smackUtil.init();
		smackUtil.seeConfig();
		smackUtil.seeConnection();

		smackUtil.createUser("test2", "test2");	

	}

利用刚创建好的帐号来登陆并发送消息

test1 登陆并发送消息:

public static void main(String[] args) {
		SmackUtil smackUtil = new SmackUtil();

		smackUtil.init();
		smackUtil.seeConfig();
		smackUtil.seeConnection();

		smackUtil.login("test1", "test1");
		smackUtil.addMsgListener();
		smackUtil.sendChatMsg("test1","test2","1111111111111111111111111111111111111");
		smackUtil.sendPacketMsg("test1","test2","1111111111111111111111111111111111111");

		try {
			Thread.sleep(1000*1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

test2 登陆并发送消息:

public static void main(String[] args) {
		SmackUtil smackUtil = new SmackUtil();

		smackUtil.init();
		smackUtil.seeConfig();
		smackUtil.seeConnection();

		smackUtil.login("test2", "test2");
		smackUtil.addMsgListener();		

		smackUtil.sendChatMsg("test2","test1","222222222222222222222222222222222222222");
		smackUtil.sendPacketMsg("test2","test1","222222222222222222222222222222222222222");

		try {
			Thread.sleep(100*1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

运行后可以分别在这两个控制台上看到收到的消息

看到这里,说明已经可以正常通讯,收发消息了。

时间: 2024-08-24 10:48:00

Openfire即时通讯服务搭建与Smack访问的相关文章

开源jabber(XMPP)架设内部即时通讯服务的解决方案

Jabber 是著名的即时通讯服务服务器,它是一个自由开源软件,能让用户自己架即时通讯服务器,可以在Internet上应用,也可以在局域网中应用.    XMPP(可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线现场探测.它在促进服务器之间的准即时操作.这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息,即使其操作系统和浏览器不同.XMPP的技术来自于Jabber,其实它是 Jabber的核心协定,所以XMPP有时被误称为Jabber协议

Android即时通讯服务,类似QQ的聊天工具,源码分享

Android即时通讯服务,类似QQ的聊天工具 基于bmob开发完成 下面有源码分享,敬请下载,多多支持回复 1.1      手机必须要有网络 1.2      手机必须要有SIM卡 1.3      手机必须要挂载有SDCAR 源码在此 链接: http://pan.baidu.com/s/1jGCIFsy 密码: 9eqc

Golang 在电商即时通讯服务建设中的实践

马蜂窝技术原创文章,更多干货请搜索公众号:mfwtech ?即时通讯(IM)功能对于电商平台来说非常重要,特别是旅游电商. 从商品复杂性来看,一个旅游商品可能会包括用户在未来一段时间的衣.食.住.行等方方面面:从消费金额来看,往往单次消费额度较大:对目的地的陌生.在行程中可能的问题,这些因素使用户在购买前.中.后都存在和商家沟通的强烈需求.可以说,一个好用的 IM 可以在一定程度上对企业电商业务的 GMV 起到促进作用. 本文我们将结合马蜂窝旅游电商 IM 服务的发展历程,重点介绍基于 Go 的

IOS即时通讯XMPP搭建openfire服务器

一.下载并安装openfire 1.到http://www.igniterealtime.org/downloads/index.jsp下载最新openfire for mac版 比如:Openfire 3.8.1,下载后的文件:openfire_3_8_1.dmg 2.点击安装,并执行默认操作 3.启动openfire服务 在系统偏好设置的其他里,点击openfire偏好 启动后,点击Open Admin Console按钮,自动在浏览器中打开本地web配置页面http://localhost

ActiveMQ 即时通讯服务 浅析

一. 概述与介绍 ActiveMQ 是Apache出品,最流行的.功能强大的即时通讯和集成模式的开源服务器.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现.提供客户端支持跨语言和协议,带有易于在充分支持JMS 1.1和1.4使用J2EE企业集成模式和许多先进的功能. 二. 特性 1. 多种语言和协议编写客户端.语言: Java.C.C++.C#.Ruby.Perl.Python.PHP.应用协议:OpenWire.Stomp REST.WS N

使用tomcat方式实现websocket即时通讯服务端讲解

第一种方案:使用Tomcat的方式实现 tomcat版本要求:tomcat7.0+.需要支持Javaee7 导入javeee-api的jar(如果已经引入可以忽略): pom.xml中加入: <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> <scope>provide

Openfire XMPP Smack RTC IM 即时通讯 聊天

目录 目录简介Openfire 简介相关的几个名词SmackSparkJIDXMPPOpenfire 安装配置测试代码初始化登录服务器登录底层报文通讯简要解析登录底层报文通讯简要解析服务器判断客户端是否在线发送消息测试案例代码项目结构MainActivity常用功能封装的工具栏 简介 Demo地址:https://github.com/baiqiantao/OpenFireTest.git 官网 官方文档 OpenFire下载 Openfire 简介 Openfire Openfire是一个根据

解读企业即时通讯

企业即时通信,简称EIM(Enterprise Instant Messaging),它是一种面向企业终端使用者的网络沟通工具服务,使用者可以通过安装了即时通信的终端机进行两人或多人之间的实时沟通.交流内容包括文字.界面.语音.视频及文件互发等. 市场分析 1.市场规模 根据调研机构调查数据显示,截止到2015年底,企业即时通讯市场规模达到10个亿美元左右.其中,中国企业即时通讯软件市场预计到2015年底达到4至6亿美元.根据某调研机构的预测2011年开始,即时通讯工具将取代声音.视频和文本,成

基于Android 平台简易即时通讯的研究与设计[转]

摘要:论文简单介绍Android 平台的特性,主要阐述了基于Android 平台简易即时通讯(IM)的作用和功能以及实现方法.(复杂的通讯如引入视频音频等可以考虑AnyChat SDK~)关键词:Android 平台:即时通讯 (本文中图表点击附件即可见) 1 Android 平台简介Android 是Google 公司于2007年11月5日推出的手机操作系统,经过2年多的发展,Android平台在智能移动领域占有不小的份额,由Google为首的40 多家移动通信领域的领军企业组成开放手机联盟(