Openfire/XMPP学习之——一个简单的Smack样例
昨天讲了Openfire的搭建和配置,今天来讲一下Smack。如果对如何搭建和配置Openfire的,可以参考Openfire/XMPP学习之——Openfire的安装、配置。
Smack是一个开源,易于使用的XMPP客户端类库。Smack API, 是一个 Java 的XMPP Client Library,也是由Jive Software开发。 优点:编程简单。 缺点:API并非为大量并发用户设计,每个客户要1个线程,占用资源大,1台机器只能模拟有限(数千个)客户。Smack是一个用 java 写的XMPP客户端代码库, 是 spark 的核心。
Smack实现给用户发送消息只要简短的三行,当然这是针对旧版的,最新版的4.0.3建议不要使用,因为会出现很多莫名其妙的错误,推荐使用Smack 3.2.2(点我点我)。
XMPPConnection connection = new XMPPConnection(”jabber.org“); connection.login(”mtucker”, “password”); connection.createChat(”jsmith@jivesoftware.com“).sendMessage(”Howdy!”);
使用Smack发送消息,大致思路分以下几步:1、创建一个XMPPConnection对象;2、注册包监听器;3、登录;4、获取Chat对象,发送消息。
以下是Java实现代码:
1 package com.travellife.Smack; 2 3 import org.jivesoftware.smack.Chat; 4 import org.jivesoftware.smack.ChatManager; 5 import org.jivesoftware.smack.ConnectionConfiguration; 6 import org.jivesoftware.smack.MessageListener; 7 import org.jivesoftware.smack.PacketListener; 8 import org.jivesoftware.smack.XMPPConnection; 9 import org.jivesoftware.smack.XMPPException; 10 import org.jivesoftware.smack.filter.PacketFilter; 11 import org.jivesoftware.smack.filter.PacketTypeFilter; 12 import org.jivesoftware.smack.packet.Message; 13 import org.jivesoftware.smack.packet.Packet; 14 15 /** 16 * 一个简单的XMPPConnection示例 17 */ 18 public class Smack { 19 public static XMPPConnection con; 20 public static Chat newChat; 21 public static ChatManager chatmanager; 22 23 public static void main(String[] args) throws InterruptedException { 24 try { 25 // 配置域和端口号,域可以换成IP地址 26 ConnectionConfiguration config = new ConnectionConfiguration( 27 "www.travellife.com", 5222); 28 // 新建一个XMPPConnection对象 29 con = new XMPPConnection(config); 30 31 // 连接服务器 32 con.connect(); 33 // 用户登录 34 con.login("lion", "1025263614"); 35 // 是否已经通过身份验证 36 System.out.println("Authenticated = " + con.isAuthenticated()); 37 38 addListener(); 39 // 获取一个ChatManager对象 40 chatmanager = con.getChatManager(); 41 newChat = chatmanager.createChat("lion@example.com", 42 new MessageListener() { 43 public void processMessage(Chat chat, Message message) { 44 System.out.println("I'm sending: " 45 + message.getBody()); 46 } 47 }); 48 newChat.sendMessage("hi"); 49 } catch (XMPPException e) { 50 e.printStackTrace(); 51 } finally { 52 // 让线程休眠 然后再关闭连接 53 Thread.sleep(20000); 54 con.disconnect(); 55 } 56 } 57 58 private static void addListener() { 59 // 包的过滤器 60 PacketFilter filterMessage = new PacketTypeFilter(Message.class); 61 // 创建包的监听器 62 PacketListener myListener = new PacketListener() { 63 public void processPacket(Packet packet) { 64 // 以XML格式输出接收到的消息 65 System.out.println(packet.toXML()); 66 System.out.println("From: " + packet.getFrom() + "\n"); 67 System.out.println("Body: " + ((Message) packet).getBody()); 68 69 try { 70 // 尝试发送消息给服务器 71 newChat.sendMessage("hi again"); 72 } catch (XMPPException e) { 73 e.printStackTrace(); 74 } 75 } 76 }; 77 // 给连接注册一个包的监听器 78 con.addPacketListener(myListener, filterMessage); 79 } 80 }
运行以上代码,你只会看到:Authenticated = true。这么一行输出,但你在Openfire的控制台发送管理消息,就可以看到如下输出:
作者:登天路