昨天讲了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实现代码:

 package com.travellife.Smack;

 import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManager;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.PacketFilter;
import org.jivesoftware.smack.filter.PacketTypeFilter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet; /**
* 一个简单的XMPPConnection示例
*/
public class Smack {
public static XMPPConnection con;
public static Chat newChat;
public static ChatManager chatmanager; public static void main(String[] args) throws InterruptedException {
try {
// 配置域和端口号,域可以换成IP地址
ConnectionConfiguration config = new ConnectionConfiguration(
"www.travellife.com", 5222);
// 新建一个XMPPConnection对象
con = new XMPPConnection(config); // 连接服务器
con.connect();
// 用户登录
con.login("lion", "1025263614");
// 是否已经通过身份验证
System.out.println("Authenticated = " + con.isAuthenticated()); addListener();
// 获取一个ChatManager对象
chatmanager = con.getChatManager();
newChat = chatmanager.createChat("lion@example.com",
new MessageListener() {
public void processMessage(Chat chat, Message message) {
System.out.println("I'm sending: "
+ message.getBody());
}
});
newChat.sendMessage("hi");
} catch (XMPPException e) {
e.printStackTrace();
} finally {
// 让线程休眠 然后再关闭连接
Thread.sleep(20000);
con.disconnect();
}
} private static void addListener() {
// 包的过滤器
PacketFilter filterMessage = new PacketTypeFilter(Message.class);
// 创建包的监听器
PacketListener myListener = new PacketListener() {
public void processPacket(Packet packet) {
// 以XML格式输出接收到的消息
System.out.println(packet.toXML());
System.out.println("From: " + packet.getFrom() + "\n");
System.out.println("Body: " + ((Message) packet).getBody()); try {
// 尝试发送消息给服务器
newChat.sendMessage("hi again");
} catch (XMPPException e) {
e.printStackTrace();
}
}
};
// 给连接注册一个包的监听器
con.addPacketListener(myListener, filterMessage);
}
}

  运行以上代码,你只会看到:Authenticated = true。这么一行输出,但你在Openfire的控制台发送管理消息,就可以看到如下输出:

  

作者:登天路

转载请说明出处:http://www.cnblogs.com/travellife/

Openfire/XMPP学习之——一个简单的Smack样例的更多相关文章

  1. 【阿菜做实践】利用go语言写一个简单的Pow样例

    本篇博客的主要内容是用go写一个简单的Proof-of-Work共识机制,不涉及到网络通信环节,只是一个本地的简单demo.开发IDE用的是JB Golang. 整个项目的文件结构如下: PoWdem ...

  2. 用tornado实现一个简单的websocket样例

    想用SPRING MVC,NODE.JS EXPRESS,TORNADO实现同一个功能,开阔一下视野. 先来TORNADO的吧.. 客户端代码都差不多,主要是服务端代码. TORNADO的说法: ht ...

  3. 新秀学习Hibernate——一个简单的例子

    一个.Hibernate开发. 上篇博客已经为大家介绍了持久层框架的发展流程,持久层框架的种类. 为了可以使用Hibernate高速上手,我们先解说一个简单的Hibernate应用实例hibernat ...

  4. Oracle简单脚本演示样例

    Oracle简单脚本演示样例 1.添加表 --改动日期:2014.09.21 --改动人:易小群 --改动内容:新增採购支付情况表 DECLARE VC_STR           VARCHAR2( ...

  5. 10.3.1 一个CONNECT BY的样例

    10.3.1 一个CONNECT BY的样例正在更新内容,请稍后

  6. WCF学习——构建一个简单的WCF应用(一)

    本文的WCF服务应用功能很简单,却涵盖了一个完整WCF应用的基本结构.希望本文能对那些准备开始学习WCF的初学者提供一些帮助. 在这个例子中,我们将实现一个简单的计算器和传统的分布式通信框架一样,WC ...

  7. Python学习 - 编写一个简单的web框架(二)

    在上一篇日志中已经讨论和实现了根据url执行相应应用,在我阅读了bottle.py官方文档后,按照bottle的设计重写一遍,主要借鉴大牛们的设计思想. 一个bottle.py的简单实例 来看看bot ...

  8. JMS学习(四)-一个简单的聊天应用程序分析

    一,介绍 本文介绍一个简单的聊天应用程序:生产者将消息发送到Topic上,然后由ActiveMQ将该消息Push给订阅了该Topic的消费者.示例程序来自于<JAVA 消息服务--第二版 Mar ...

  9. OpenCV学习(2)——一个简单的例子

    光说不练假把式,来看一个简单的例子,了解了解OpenCV.这个小demo没有几行代码,作用是显示项目目录下面的一张图片. #include <opencv2\opencv.hpp> #in ...

随机推荐

  1. python lxml install

    之前记得安装libxslt和libxml yum install libxml* -yyum install libxslt* -y wget http://lxml.de/files/lxml-3. ...

  2. 深入理解javascript系列(4):立即调用的函数表达式

    本文来自汤姆大叔 前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行. 在详细了解这个之前,我们来谈了解一下“自执行”这个叫法,本文对这个功能的叫法 ...

  3. THINKPHP之连接数据库(全局配置)

  4. redis配置文件英译汉

    # By default Redis asynchronously dumps the dataset on disk. This mode is # good enough in many appl ...

  5. 前端-SEO

    SEO是 search Engine Optimization   (搜索引擎优化) SEO: ①白帽SEO(普通SEO做的优化) 网站标题.关键字.描述 网站内容优化 Robot.txt文件 网站地 ...

  6. 微信支付:JSAPI支付一直提示URL未注册

    今天意外碰上了这个问题,想想微信的坑真多…… 解决办法: 首先要看微信公众号里的 支付授权目录 是否已正确填写,还要验证 url大小写 必须相同 其次查看一下自己请求的地址是否与上面填写的是否一样!u ...

  7. Linux上传下载文件快捷命令

    远程链接Linux(如SecrueCRT),要上传文件很下载文件到Linux服务器,只需要使用sz或者rz命令即可快速下载和上传文件了. 使用方法: 1.首先确保Linux服务器系统中安装了lrzsz ...

  8. C#_技巧:字符串分组排序

    思想//GroupBy+ToDictionary实现Dictionary<> List<string> list = new List<string>(); //l ...

  9. 标准数据源访问库 - JayData

    JayData 是一个标准的.跨平台的库和方法,用于访问和操作各种不同的数据源,最适合用于 JavaScript 和 HTML5 应用. 官方网站:http://jaydata.org/  ASP.N ...

  10. 尝试解决在构造函数中同步调用Dns.GetHostAddressesAsync()引起的线程死锁

    (最终采用的是方法4) 问题详情见:.NET Core中遇到奇怪的线程死锁问题:内存与线程数不停地增长 看看在 Linux 与 Windows 上发生线程死锁的后果. Linux: Microsoft ...