`
shuai1234
  • 浏览: 972429 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

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

 

下面开始代码部分

package com.hoo.smack;
 
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.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;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
 
/**
 * <b>function:</b> 利用Smack框架完成 XMPP 协议通信
 * @author hoojo
 * @createDate 2012-5-22 上午10:28:18
 * @file ConnectionServerTest.java
 * @package com.hoo.smack.conn
 * @project jwchat
 * @blog http://blog.csdn.net/IBM_hoojo
 * @email hoojo_@126.com
 * @version 1.0
 */
public class SmackXMPPTest {
 
    private Connection connection;
    private ConnectionConfiguration config;
    /** openfire服务器address */
    private final static String server = "192.168.8.32";
    
    private final void fail(Object o) {
        if (o != null) {
            System.out.println(o);
        }
    }
    
    private final void fail(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);
        }
    }
    
    /**
     * <b>function:</b> 初始Smack对openfire服务器链接的基本配置
     * @author hoojo
     * @createDate 2012-6-25 下午04:06:42
     */
    @Before
    public void init() {
        try {
            //connection = new XMPPConnection(server);
            //connection.connect();
            /** 5222是openfire服务器默认的通信端口,你可以登录http://192.168.8.32: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();
        } catch (XMPPException e) {
            e.printStackTrace();
        }
        fail(connection);
        fail(connection.getConnectionID());
    }
    
    @After
    public void destory() {
        if (connection != null) {
            connection.disconnect();
            connection = null;
        }
    }
    
    /**
     * <b>function:</b> ConnectionConfiguration 的基本配置相关信息
     * @author hoojo
     * @createDate 2012-6-25 下午04:11:25
     */
    @Test
    public void testConfig() {
        fail("PKCS11Library: " + config.getPKCS11Library());
        fail("ServiceName: {0}", config.getServiceName());
        // ssl证书密码
        fail("TruststorePassword: {0}", config.getTruststorePassword());
        fail("TruststorePath: {0}", config.getTruststorePath());
        fail("TruststoreType: {0}", config.getTruststoreType());
        
        SocketFactory socketFactory = config.getSocketFactory();
        fail("SocketFactory: {0}", socketFactory);
        /*try {
            fail("createSocket: {0}", socketFactory.createSocket("localhost", 3333));
        } catch (IOException e) {
            e.printStackTrace();
        }*/
    }
    
    /**
     * <b>function:</b> Connection 基本方法信息
     * @author hoojo
     * @createDate 2012-6-25 下午04:12:04
     */
    @Test
    public void testConnection() {
        /** 用户管理 */
        AccountManager accountManager = connection.getAccountManager();
        for (String attr : accountManager.getAccountAttributes()) {
            fail("AccountAttribute: {0}", attr);
        }
        fail("AccountInstructions: {0}", accountManager.getAccountInstructions());
        /** 是否链接 */
        fail("isConnected:", connection.isConnected());
        fail("isAnonymous:", connection.isAnonymous());
        /** 是否有权限 */
        fail("isAuthenticated:", connection.isAuthenticated());
        fail("isSecureConnection:", connection.isSecureConnection());
        /** 是否使用压缩 */
        fail("isUsingCompression:", connection.isUsingCompression());
    }
    
    /**
     * <b>function:</b> 用户管理器
     * @author hoojo
     * @createDate 2012-6-25 下午04:22:31
     */
    @Test
    public void testAccountManager() {
        AccountManager accountManager = connection.getAccountManager();
        for (String attr : accountManager.getAccountAttributes()) {
            fail("AccountAttribute: {0}", attr);
        }
        fail("AccountInstructions: {0}", accountManager.getAccountInstructions());
        
        fail("supportsAccountCreation: {0}", accountManager.supportsAccountCreation());
        try {
            /** 创建一个用户boy,密码为boy;你可以在管理员控制台页面http://192.168.8.32:9090/user-summary.jsp查看用户/组的相关信息,来查看是否成功创建用户 */
            accountManager.createAccount("boy", "boy");
            /** 修改密码 */
            accountManager.changePassword("abc");
        } catch (XMPPException e) {
            e.printStackTrace();
        }
    }
    
    @Test
    public void testUser() {
        try {
            /** 用户登陆,用户名、密码 */
            connection.login("hoojo", "hoojo");
        } catch (XMPPException e) {
            e.printStackTrace();
        }
        /** 获取当前登陆用户 */
        fail("User:", connection.getUser());
        
        /** 所有用户组 */
        Roster roster = connection.getRoster();
        
        /** 好友用户组,你可以用Spark添加用户好友,这样这里就可以查询到相关的数据 */
        Collection<RosterEntry> rosterEntiry = roster.getEntries();
        Iterator<RosterEntry> iter = rosterEntiry.iterator();
        while (iter.hasNext()) {
            RosterEntry entry = iter.next();
            fail("Groups: {0}, Name: {1}, Status: {2}, Type: {3}, User: {4}", entry.getGroups(), entry.getName(), entry.getStatus(), entry.getType(), entry);
        }
        
        fail("-------------------------------");
        /** 未处理、验证好友,添加过的好友,没有得到对方同意 */
        Collection<RosterEntry> unfiledEntries = roster.getUnfiledEntries();
        iter = unfiledEntries.iterator();
        while (iter.hasNext()) {
            RosterEntry entry = iter.next();
            fail("Groups: {0}, Name: {1}, Status: {2}, Type: {3}, User: {4}", entry.getGroups(), entry.getName(), entry.getStatus(), entry.getType(), entry);
        }
    }
    
    @Test
    @SuppressWarnings("static-access")
    public void testPacket() {
        try {
            connection.login("hoojo", "hoojo");
        } catch (XMPPException e) {
            e.printStackTrace();
        }
        
        //Packet packet = new Data(new DataPacketExtension("jojo@" + server, 2, "this is a message"));
        //connection.sendPacket(packet);
        
        /** 更改用户状态,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);
        /** 向jojo@192.168.8.32 发送聊天消息,此时你需要用Spark软件登陆jojo这个用户,
         * 这样代码就可以向jojo这个用户发送聊天消息,Spark登陆的jojo用户就可以接收到消息
         **/
        /** Type.chat 表示聊天,groupchat多人聊天,error错误,headline在线用户; */
        Message message = new Message("jojo@" + server, Type.chat);
        //Message message = new Message(sessid, Type.chat);
        message.setBody("h!~ jojo, I'am is hoojo!");
        connection.sendPacket(message);
        
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * <b>function:</b> 测试聊天消息管理类
     * @author hoojo
     * @createDate 2012-6-25 下午05:03:23
     */
    @Test
    public void testChatManager() {
        /** 设置状态 */
        try {
            connection.login("hoojo", "hoojo");
        } catch (XMPPException e) {
            e.printStackTrace();
        }
        
        /** 设置状态 */
        Presence presence = new Presence(Presence.Type.available);
        presence.setStatus("Q我吧");
        connection.sendPacket(presence);
        
        /** 获取当前登陆用户的聊天管理器 */
        ChatManager chatManager = connection.getChatManager();
        /** 为指定用户创建一个chat,MyMessageListeners用于监听对方发过来的消息  */
        Chat chat = chatManager.createChat("jojo@" + server, new MyMessageListeners());
        try {
            /** 发送消息 */
            chat.sendMessage("h!~ jojo……");
            
            /** 用message对象发送消息 */
            Message message = new Message();
            message.setBody("message");
            message.setProperty("color", "red");
            chat.sendMessage(message);
        } catch (XMPPException e) {
            e.printStackTrace();
        }
        try {
            Thread.sleep(1000 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * <b>function:</b> 消息监听器,用户监听对方发送的消息,也可以想对方发送消息
     * @author hoojo
     * @createDate 2012-6-25 下午05:05:31
     * @file SmackXMPPTest.java
     * @package com.hoo.smack
     * @project jwchat
     * @blog http://blog.csdn.net/IBM_hoojo
     * @email hoojo_@126.com
     * @version 1.0
     */
    class MyMessageListeners implements MessageListener {
        public void processMessage(Chat chat, Message message) {
            try {
                /** 发送消息 */
                chat.sendMessage("dingding……" + message.getBody());
            } catch (XMPPException e) {
                e.printStackTrace();
            }
            /** 接收消息 */
            fail("From: {0}, To: {1}, Type: {2}, Sub: {3}", message.getFrom(), message.getTo(), message.getType(), message.toXML());
            /*Collection<Body> bodys =  message.getBodies();
            for (Body body : bodys) {
                fail("bodies[{0}]", body.getMessage());
            }
            //fail(message.getLanguage());
            //fail(message.getThread());
            //fail(message.getXmlns());*/
            fail("body: ", message.getBody());
        }
    }
}

 

好了,这些都是smack的基本功能,还有更多的东西需要研究,下次有机会再分享!

分享到:
评论

相关推荐

    IM(Spark+Smack+Openfire)开发资料详细说明文档

    在实际开发中,首先需要安装并配置Openfire服务器,然后使用Smack库建立客户端连接,最后通过Spark客户端进行用户界面的展示和交互。开发者需要理解XMPP协议的工作原理,掌握Spark的UI定制,以及熟练运用Smack的API...

    Android IM之基于Openfire+Smack的聊天服务器的搭建与测试

    本教程将探讨如何利用Openfire服务器和Smack库来搭建一个基础的Android聊天应用。Openfire是一款开源的XMPP服务器,而Smack是Java和Android上用于XMPP协议的客户端库。 首先,我们需要安装和配置Openfire服务器。...

    websocket+smack+openfire的的源代码

    WebSocket、Smack 和 Openfire 是三个在实时通信领域中经常使用的开源工具,它们共同构建了一个高效、可扩展的即时通讯(IM)系统。下面将详细解释这三个组件以及它们如何协同工作。 WebSocket 是一种在 Web 上提供...

    websocket+smack+openfire的所有lib库

    Smack 提供了 Java 和 Android 平台上的客户端库,支持连接到 XMPP 服务器,进行用户注册、登录、发送和接收消息、管理联系人列表等功能。通过 Smack,开发者可以快速开发出功能丰富的 IM 应用。 OpenFire 是一款...

    android使用smack,openfire通信

    Android上最常用的组合asmack +openfire。Asmack是smack的android版,是对xmpp协议进行...Openfire是一个开源的IM服务器,基于Xmpp实现。换句话说使用xmpp开发即时通讯应用的话,服务器端已经开发好了,就是openfire。

    基于openfire 的android IM 即时通讯smack的android IM

    本教程将聚焦于如何利用Openfire服务器和Smack库构建一个基于Android的IM应用。 Openfire是一款开源的、基于XMPP协议的实时通讯服务器。XMPP(Extensible Messaging and Presence Protocol)是一种标准通信协议,...

    smack连接openfire用到的jar包

    在Java开发中,实现即时通讯(Instant Messaging,简称IM)是一项常见的需求,而Smack库与Openfire服务器的结合提供了一种高效、稳定的解决方案。本文将深入探讨如何使用这些技术来构建一个基于Java的IM系统。 ...

    Openfire 4.2.3+Smack 4.3.0最新安装包

    Smack提供了连接管理、会话建立、消息发送与接收、用户状态管理、多用户聊天室等功能。它的API设计直观,使得开发人员能快速上手实现即时通讯功能。 在使用Openfire和Smack构建即时通讯系统时,首先需要在Openfire...

    spark_smack_openfire.zip_openfire spark_spark xmpp_xmpp _xmpp op

    本资料主要探讨如何利用Apache Spark、Smack库以及Openfire服务器来构建一个基于XMPP协议的即时通讯系统。首先,我们需要了解这三个关键组件的作用。 1. **Openfire**:Openfire是一款开源、免费的企业级即时通讯...

    XMPP_OPenfire即时通讯IM-android版

    在这个“XMPP_OPenfire即时通讯IM-android版”项目中,我们关注的是在Android平台上利用Smack库实现与Openfire服务器的交互。 Smack是一个流行的Java库,支持XMPP协议,允许开发者在Java应用程序中实现IM功能。在这...

    Android使用XMPP协议、OpenFire服务器和Smack类库实现即时通信

    本篇文章将深入探讨如何利用XMPP协议,结合OpenFire服务器以及Smack类库,在Android项目中构建一个即时通讯应用。 首先,我们需要了解OpenFire服务器。OpenFire是一款免费、开源的XMPP服务器,它支持多种操作系统,...

    Smack 4.1 + Android + Openfire 聊天项目搭建

    在本文中,我们将深入探讨如何使用Smack 4.1库、Android平台以及Openfire服务器来构建一个实时聊天应用程序。Smack是一个强大的开源Java库,专门用于处理XMPP(Extensible Messaging and Presence Protocol)协议,...

    Android-XMPP-openfire-实现IM

    - **Smack库**:在Android中,开发者通常使用Smack库来实现XMPP协议,它提供了API用于连接Openfire服务器,发送和接收消息。 - **连接管理**:客户端需要建立与Openfire服务器的连接,处理登录、心跳保活、断线重...

    基于openfire的android即时通信

    "基于openfire的android即时通信"项目提供了一个实践性的Android IM解决方案,结合开源的Openfire服务器,开发者可以快速地构建起自己的即时通讯应用。通过深入理解XMPP协议,熟悉Android客户端的开发要点,以及熟练...

    Android+smack4.1.4+openfire demo

    通过这个“Android+smack4.1.4+openfire demo”,开发者可以学习如何在Android应用中实现实时通信功能,包括连接Openfire服务器、登录、获取好友列表以及发送和接收消息。这个示例代码可以作为Android即时通讯应用...

    Android 基于xmpp协议,smack包,openfire服务端的高仿QQ的即时通讯实现.zip

    这个项目就是基于XMPP(Extensible Messaging and Presence Protocol)协议,使用Smack库,并结合Openfire服务器实现的。现在,我们将深入探讨这些关键组件以及如何将它们整合到Android应用中。 1. **XMPP协议**:...

    OpenFire+smack3.0.4 即时通讯Demo

    1. **连接与认证**:通过Smack API建立与OpenFire服务器的连接,并进行用户身份验证。 2. **发送与接收消息**:展示如何创建和发送即时消息,以及接收和显示来自其他用户的即时消息。 3. **用户状态管理**:演示如何...

    Android端Smack对Openfire的访问

    本文将深入探讨如何在Android端使用Smack库来访问和交互Openfire服务器。 首先,了解XMPP协议是关键。XMPP是一种基于XML的实时通信协议,被设计用于实现双向、异步的消息传递。它不仅支持文本消息,还可以扩展到...

    基于openfire的安卓聊天软件

    - **XMPP Libraries**:如Smack或XMPPTCPConnection,提供与Openfire服务器的通信接口。 - **JSON**:用于数据交换格式,如在注册和登录过程中传输用户信息。 - **SSL/TLS**:确保客户端与服务器之间的通信安全。 - ...

Global site tag (gtag.js) - Google Analytics