java Smack整合Openfire服务器实现IM即时通讯聊天功能

59 篇文章 0 订阅

在文章开始,请你了解和熟悉openfire方面的相关知识,这样对你理解下面代码以及下面代码的用途有很好的了解。同时,你可能需要安装一个简单的CS聊天工具,来测试你的代码是否成功的在openfire服务器上建立会话链接,并成功的向在线用户发送聊天消息。

聊天软件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

001package com.hoo.smack;
002  
003import java.util.Collection;
004import java.util.Iterator;
005import javax.net.SocketFactory;
006import org.jivesoftware.smack.AccountManager;
007import org.jivesoftware.smack.Chat;
008import org.jivesoftware.smack.ChatManager;
009import org.jivesoftware.smack.Connection;
010import org.jivesoftware.smack.ConnectionConfiguration;
011import org.jivesoftware.smack.MessageListener;
012import org.jivesoftware.smack.Roster;
013import org.jivesoftware.smack.RosterEntry;
014import org.jivesoftware.smack.XMPPConnection;
015import org.jivesoftware.smack.XMPPException;
016import org.jivesoftware.smack.packet.Message;
017import org.jivesoftware.smack.packet.Presence;
018import org.jivesoftware.smack.packet.Session;
019import org.jivesoftware.smack.packet.Message.Type;
020import org.junit.After;
021import org.junit.Before;
022import org.junit.Test;
023  
024/**
025 * 利用Smack框架完成 XMPP 协议通信
026 */
027public class SmackXMPPTest {
028  
029    private Connection connection;
030    private ConnectionConfiguration config;
031    /** openfire服务器address */
032    private final static String server = "192.168.8.32";
033     
034    private final void fail(Object o) {
035        if (o != null) {
036            System.out.println(o);
037        }
038    }
039     
040    private final void fail(Object o, Object... args) {
041        if (o != null && args != null && args.length > 0) {
042            String s = o.toString();
043            for (int i = 0; i < args.length; i++) {
044                String item = args[i] == null ? "" : args[i].toString();
045                if (s.contains("{" + i + "}")) {
046                    s = s.replace("{" + i + "}", item);
047                } else {
048                    s += " " + item;
049                }
050            }
051            System.out.println(s);
052        }
053    }
054     
055    /**
056     *  初始Smack对openfire服务器链接的基本配置
057     */
058    @Before
059    public void init() {
060        try {
061            //connection = new XMPPConnection(server);
062            //connection.connect();
063            /** 5222是openfire服务器默认的通信端口,你可以登录http://192.168.8.32:9090/到管理员控制台查看客户端到服务器端口 */
064            config = new ConnectionConfiguration(server, 5222);
065             
066            /** 是否启用压缩 */
067            config.setCompressionEnabled(true);
068            /** 是否启用安全验证 */
069            config.setSASLAuthenticationEnabled(true);
070            /** 是否启用调试 */
071            config.setDebuggerEnabled(false);
072            //config.setReconnectionAllowed(true);
073            //config.setRosterLoadedAtLogin(true);
074             
075            /** 创建connection链接 */
076            connection = new XMPPConnection(config);
077            /** 建立连接 */
078            connection.connect();
079        } catch (XMPPException e) {
080            e.printStackTrace();
081        }
082        fail(connection);
083        fail(connection.getConnectionID());
084    }
085     
086    @After
087    public void destory() {
088        if (connection != null) {
089            connection.disconnect();
090            connection = null;
091        }
092    }
093     
094    /**
095     * ConnectionConfiguration 的基本配置相关信息
096     */
097    @Test
098    public void testConfig() {
099        fail("PKCS11Library: " + config.getPKCS11Library());
100        fail("ServiceName: {0}", config.getServiceName());
101        // ssl证书密码
102        fail("TruststorePassword: {0}", config.getTruststorePassword());
103        fail("TruststorePath: {0}", config.getTruststorePath());
104        fail("TruststoreType: {0}", config.getTruststoreType());
105         
106        SocketFactory socketFactory = config.getSocketFactory();
107        fail("SocketFactory: {0}", socketFactory);
108        /*try {
109            fail("createSocket: {0}", socketFactory.createSocket("localhost", 3333));
110        } catch (IOException e) {
111            e.printStackTrace();
112        }*/
113    }
114     
115    /**
116     *  Connection 基本方法信息
117     */
118    @Test
119    public void testConnection() {
120        /** 用户管理 */
121        AccountManager accountManager = connection.getAccountManager();
122        for (String attr : accountManager.getAccountAttributes()) {
123            fail("AccountAttribute: {0}", attr);
124        }
125        fail("AccountInstructions: {0}", accountManager.getAccountInstructions());
126        /** 是否链接 */
127        fail("isConnected:", connection.isConnected());
128        fail("isAnonymous:", connection.isAnonymous());
129        /** 是否有权限 */
130        fail("isAuthenticated:", connection.isAuthenticated());
131        fail("isSecureConnection:", connection.isSecureConnection());
132        /** 是否使用压缩 */
133        fail("isUsingCompression:", connection.isUsingCompression());
134    }
135     
136    /**
137     * 用户管理器
138     */
139    @Test
140    public void testAccountManager() {
141        AccountManager accountManager = connection.getAccountManager();
142        for (String attr : accountManager.getAccountAttributes()) {
143            fail("AccountAttribute: {0}", attr);
144        }
145        fail("AccountInstructions: {0}", accountManager.getAccountInstructions());
146         
147        fail("supportsAccountCreation: {0}", accountManager.supportsAccountCreation());
148        try {
149            /** 创建一个用户boy,密码为boy;你可以在管理员控制台页面http://192.168.8.32:9090/user-summary.jsp查看用户/组的相关信息,来查看是否成功创建用户 */
150            accountManager.createAccount("boy", "boy");
151            /** 修改密码 */
152            accountManager.changePassword("abc");
153        } catch (XMPPException e) {
154            e.printStackTrace();
155        }
156    }
157     
158    @Test
159    public void testUser() {
160        try {
161            /** 用户登陆,用户名、密码 */
162            connection.login("hoojo", "hoojo");
163        } catch (XMPPException e) {
164            e.printStackTrace();
165        }
166        /** 获取当前登陆用户 */
167        fail("User:", connection.getUser());
168         
169        /** 所有用户组 */
170        Roster roster = connection.getRoster();
171         
172        /** 好友用户组,你可以用Spark添加用户好友,这样这里就可以查询到相关的数据 */
173        Collection<RosterEntry> rosterEntiry = roster.getEntries();
174        Iterator<RosterEntry> iter = rosterEntiry.iterator();
175        while (iter.hasNext()) {
176            RosterEntry entry = iter.next();
177            fail("Groups: {0}, Name: {1}, Status: {2}, Type: {3}, User: {4}", entry.getGroups(), entry.getName(), entry.getStatus(), entry.getType(), entry);
178        }
179         
180        fail("-------------------------------");
181        /** 未处理、验证好友,添加过的好友,没有得到对方同意 */
182        Collection<RosterEntry> unfiledEntries = roster.getUnfiledEntries();
183        iter = unfiledEntries.iterator();
184        while (iter.hasNext()) {
185            RosterEntry entry = iter.next();
186            fail("Groups: {0}, Name: {1}, Status: {2}, Type: {3}, User: {4}", entry.getGroups(), entry.getName(), entry.getStatus(), entry.getType(), entry);
187        }
188    }
189     
190    @Test
191    @SuppressWarnings("static-access")
192    public void testPacket() {
193        try {
194            connection.login("hoojo", "hoojo");
195        } catch (XMPPException e) {
196            e.printStackTrace();
197        }
198         
199        //Packet packet = new Data(new DataPacketExtension("jojo@" + server, 2, "this is a message"));
200        //connection.sendPacket(packet);
201         
202        /** 更改用户状态,available=true表示在线,false表示离线,status状态签名;当你登陆后,在Spark客户端软件中就可以看到你登陆的状态 */
203        Presence presence = new Presence(Presence.Type.available);
204        presence.setStatus("Q我吧");
205        connection.sendPacket(presence);
206         
207        Session session = new Session();
208        String sessid = session.nextID();
209        connection.sendPacket(session);
210        /** 向jojo@192.168.8.32 发送聊天消息,此时你需要用Spark软件登陆jojo这个用户,
211         * 这样代码就可以向jojo这个用户发送聊天消息,Spark登陆的jojo用户就可以接收到消息
212         **/
213        /** Type.chat 表示聊天,groupchat多人聊天,error错误,headline在线用户; */
214        Message message = new Message("jojo@" + server, Type.chat);
215        //Message message = new Message(sessid, Type.chat);
216        message.setBody("h!~ jojo, I'am is hoojo!");
217        connection.sendPacket(message);
218         
219        try {
220            Thread.sleep(1);
221        } catch (InterruptedException e) {
222            e.printStackTrace();
223        }
224    }
225     
226    /**
227     *  测试聊天消息管理类
228     */
229    @Test
230    public void testChatManager() {
231        /** 设置状态 */
232        try {
233            connection.login("hoojo", "hoojo");
234        } catch (XMPPException e) {
235            e.printStackTrace();
236        }
237         
238        /** 设置状态 */
239        Presence presence = new Presence(Presence.Type.available);
240        presence.setStatus("Q我吧");
241        connection.sendPacket(presence);
242         
243        /** 获取当前登陆用户的聊天管理器 */
244        ChatManager chatManager = connection.getChatManager();
245        /** 为指定用户创建一个chat,MyMessageListeners用于监听对方发过来的消息  */
246        Chat chat = chatManager.createChat("jojo@" + server, new MyMessageListeners());
247        try {
248            /** 发送消息 */
249            chat.sendMessage("h!~ jojo……");
250             
251            /** 用message对象发送消息 */
252            Message message = new Message();
253            message.setBody("message");
254            message.setProperty("color", "red");
255            chat.sendMessage(message);
256        } catch (XMPPException e) {
257            e.printStackTrace();
258        }
259        try {
260            Thread.sleep(1000 * 1000);
261        } catch (InterruptedException e) {
262            e.printStackTrace();
263        }
264    }
265     
266    /**
267     *  消息监听器,用户监听对方发送的消息,也可以想对方发送消息
268     */
269    class MyMessageListeners implements MessageListener {
270        public void processMessage(Chat chat, Message message) {
271            try {
272                /** 发送消息 */
273                chat.sendMessage("dingding……" + message.getBody());
274            } catch (XMPPException e) {
275                e.printStackTrace();
276            }
277            /** 接收消息 */
278            fail("From: {0}, To: {1}, Type: {2}, Sub: {3}", message.getFrom(), message.getTo(), message.getType(), message.toXML());
279            /*Collection<Body> bodys =  message.getBodies();
280            for (Body body : bodys) {
281                fail("bodies[{0}]", body.getMessage());
282            }
283            //fail(message.getLanguage());
284            //fail(message.getThread());
285            //fail(message.getXmlns());*/
286            fail("body: ", message.getBody());
287        }
288    }
289}

好了,这些都是smack的基本功能。

原文地址:http://www.blogjava.net/hoojo/archive/2012/06/25/381445.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值