Smack 4.1.x升级指南
一、Smack 4.1的主要改进
Smack 4.1.x最大的改进有两点:
1)支持XEP-198规范,即流管理
2)原生支持Android
Smack 4.1使得原先的aSmack库可以丢入垃圾堆了。注意aSmack的最新版本只到4.0.7版。
二、流管理
流管理(Stream Management)
Smack 4.1默认流管理是关闭的。可以通过下面的方法开启流管理:
XMPPTCPConnection.setUseStreamManagement(true)
流管理规范可以查阅:http://xmpp.org/extensions/xep-0198.html
流管理是XMPP的一个扩展,添加了确认(Acknowledgement)节和流恢复。这意味着如果在手机上使用Jabber,那么即使不在服务区,也不会丢失消息。
Jaber使用TCP协议,TCP协议是可靠的协议,当用户丢失连接时,消息可能丢失,此时服务区仍然保持了对客户端打开TCP连接,发送消息,而客户端离开服务区,消息可能就丢失了。
在较好的情况下,客户端离开服务区时,网络服务商(Network Provider)会立即关闭连接,这样的话,消息就会作为离线消息保存到服务器。而在某些较坏的情况下,客户端离开l 服务区,而服务器的连接并没有断开,此时服务器转发消息到客户端,消息就会丢失。
XEP-198规范就是针对这种情况的解决方案,它并不是让客户端离线时还能保持连接,而是引入了两个重要的元素,让客户端在错过了消息后还能把消息找回来。
确认节允许服务器和客户端对每一个发送的单个消息或群消息的请求进行确认,一旦收到了确认,就认为消息交付成功了。
当重建连接时,使用流恢复。通过在确认节包含序列号,客户端和服务器都能彼此清楚消息是在什么时候中断的,能重新发送消息。
这两个机制可以对交付的每一条消息提供可靠的保证,同样的机制还可用于S2S(服务器连接服务器)。
三、Smack 4.1的API变化
Smack 4.1.x主要的API变化包括:
-
XMPPConnection变更为接口
当声明连接时,可以使用AbstractXMPPConnection或者是XMPPConnection的子类作为静态类型。 -
重新实现了SASL认证
对于自定义的SASL机制,或许要调整代码。 -
添加了IQ请求句柄API
包(Packet)监听器和包收集器不再能监听IQ请求,也即IQ的“get”和“set”类型。 -
XMPPConnection.addPacketListener方法被废弃了
改为用添加异步包监听器addAsyncPacketListener方法或添加同步包监听器addSyncPacketListener方法来代替它。 -
StringUtils工具类
StringUtils工具类添加到XmppStringUtils包(在jxmpp-core包中),方法名也有些变化,比如parseName变更为parseLocalpart。 -
消息监听器类的变化
消息监听器MessageListener类改名为ChatMessageListener,MessageListener类名现在是不通的接口。 -
连接配置类使用了Builder模式
连接配置ConnectionConfiguration类使用了Builder设计模式。 -
FormField.getType和Form.getType
FormField.getType和Form.getType都改成了枚举类型Enum。 -
废弃了包Packet接口
包Packet接口废弃了。使用新的Stanza类的getStanzaId方法来代替getPacketID方法。 -
Roster类的变化
使用Roster.instance获得一个实例,原先是XMPPConnection.getRoster方法获得的。 -
ConnectionListener.authenticated方法的变化
ConnectionListener.authenticated方法新增了一个布尔型参数resumed。 -
XMPPTCPConnection.addStanzaAcknowledgedListener方法取消了一个异常
XMPPTCPConnection.addStanzaAcknowledgedListener方法取消了StreamManagementNotEnabledException异常。 -
如果使用SASL扩展,要使用ConnectionConfiguration.Builder.allowEmptyOrNullUsernames
-
SmackConfiguration.DEBUG_ENABLED变更为SmackConfiguration.DEBUG