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

在文章开始,请你了解和熟悉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

view source print ?
001 package com.hoo.smack;
002   
003 import java.util.Collection;
004 import java.util.Iterator;
005 import javax.net.SocketFactory;
006 import org.jivesoftware.smack.AccountManager;
007 import org.jivesoftware.smack.Chat;
008 import org.jivesoftware.smack.ChatManager;
009 import org.jivesoftware.smack.Connection;
010 import org.jivesoftware.smack.ConnectionConfiguration;
011 import org.jivesoftware.smack.MessageListener;
012 import org.jivesoftware.smack.Roster;
013 import org.jivesoftware.smack.RosterEntry;
014 import org.jivesoftware.smack.XMPPConnection;
015 import org.jivesoftware.smack.XMPPException;
016 import org.jivesoftware.smack.packet.Message;
017 import org.jivesoftware.smack.packet.Presence;
018 import org.jivesoftware.smack.packet.Session;
019 import org.jivesoftware.smack.packet.Message.Type;
020 import org.junit.After;
021 import org.junit.Before;
022 import org.junit.Test;
023   
024 /**
025  * 利用Smack框架完成 XMPP 协议通信
026  */
027 public 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 rosterEntiry = roster.getEntries();
174         Iterator 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 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         /** 向[email protected] 发送聊天消息,此时你需要用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 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

你可能感兴趣的:(ANDROID,JAVA)