本文将向您介绍Smack API,并提供重要的类和概念的概述。
JAR文件和相关要求(注意点)
Smack可以轻松地嵌入到任何现有的Java应用程序中。 库被分作几个JAR文件,以便更灵活的按需求给应用程序提供相关功能:
smack-core.jar
- 提供核心XMPP功能。 包括作为XMPP RFC的一部分的所有XMPP功能。
smack-im.jar - 提供RFC 6121(XMPP-IM)中定义的功能,如花名册。
smack-tcp.jar - 通过TCP支持XMPP。 包括XMPPTCPConnection类,一个常用的类。
smack-extensions.jar - 支持由XMPP标准基金会定义的许多扩展(XEP),包括多用户聊天,文件传输,用户搜索等。
smack-experimental.jar - 支持由XMPP标准基金会定义的实验扩展(XEP)。 这些扩展的API和功能通常被认为是不稳定的。
smack-legacy.jar - 支持由XMPP标准基金会定义的旧扩展(XEP)。
smack-bosh.jar - 支持BOSH(XEP-0124)。 该代码应该被视为beta。
smack-jingle.jar - 支持Jingle。 这段代码是旧的,现已不再维护。
smack-resolver-dnsjava.jar - 支持在dnsjava的帮助下解析DNS SRV记录。 适用于不支持javax.naming API的平台。
smack-resolver-javax.jar - 支持使用javax命名空间API解析DNS SRV记录。
smack-debug.jar - 用于协议流量的增强型GUI调试器。 当在类路径中找到并且启用调试时,它将自动使用。
配置
Smack有一个包含两个阶段的初始化过程。
- 初始化系统属性 - 初始化通过类SmackConfiguration可访问的所有系统属性。 这些属性由该类的getXXX方法获取。
- 初始化启动类 - 通过实例化过程初始化任何在启动时处于活动状态的类,如果扩展了SmackInitializer ,则调用该类的initialize方法。 如果它不扩展这个接口,那么初始化将必须在一个静态的代码块中进行,这个代码在加载类时自动执行。
初始化通过配置文件完成。 默认情况下,Smack将加载嵌入在Smack.jar中的org.jivesoftware.smack / smack- config.xml。 此特定配置包含将要被加载的初始化程序类(initializer 初始化者)的列表。 所有需要初始化的管理员(manager )类型类都是初始化程序类(initializer 初始化者)。
建立连接
XMPPTCPConnection类用于创建与XMPP服务器的连接。 以下是进行连接的代码示例:
// Create a connection to the jabber.org server.
AbstractXMPPConnection conn1 = new XMPPTCPConnection("username", "password" "jabber.org");
conn1.connect();
// Create a connection to the jabber.org server on a specific port.
XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
.setUsernameAndPassword("username", "password")
.setXmppDomain("jabber.org")
.setHost("earl.jabber.org")
.setPort("8222")
.build();
AbstractXMPPConnection conn2 = new XMPPTCPConnection(config);
conn2.connect();
请注意,默认情况下,连接到服务器时将使用最大的安全性(当可能的时候),包括使用TLS加密。 ConnectionConfiguration类提供对创建的连接的高级控制,例如禁用或开启加密的功能。 有关详细信息,请参阅XMPPConnection Management 。
创建连接后,您应该使用XMPPConnection.login()方法登录。 登录后,您可以通过创建新的Chat或MultiUserChat对象与其他用户进行聊天。
与花名册配合工作
花名册可让您跟踪其他用户的可用性(在线状态)。 用户可以组织成“朋友”和“同事”组,知晓每个用户是在线还是离线。
使用Roster.getInstanceFor(XMPPConnection)方法获取花名册。 花名册类允许您查找所有的花名册条目,它们所属的组以及每个条目的当前状态。
从客户端向XMPP服务器发送的每条消息称为一个数据包(packet),并以XML格式发送。 org.jivesoftware.smack.packet包包含封装XMPP允许的三种(message, presence, and IQ)不同基本数据包类型的类。 诸如Chat和GroupChat提供了管理自动创建和发送数据包的更高级别的结构(高级方法),但是您也可以直接创建和发送数据包。 以下是一个代码示例,用于更改您的在线状态,让人们知道您“外出钓鱼”:
// Create a new presence. Pass in false to indicate we're unavailable._
Presence presence = new Presence(Presence.Type.unavailable);
presence.setStatus("Gone fishing");
// Send the stanza (assume we have an XMPPConnection instance called "con").
con.sendStanza(presence);
Smack提供了两种读取传入数据包的方式: StanzaListener和StanzaCollector
。 两者都使用StanzaFilter实例来确定应该处理哪个XML Stanza(XML节)。 StanzaListener用于事件风格编程,而节StanzaCollector具有一个可以进行轮询和阻止操作的数据包结果队列。 所以,当一个节出现时,当你想采取一些动作时,一个StanzaListener会很有用,而当你想要等待一个特定的数据包到达时,一个StanzaCollector会很有用。 可以使用Connection实例创建StanzaListener和StanzaCollector。