分享

Smack 体系结构

 Reven 2011-03-30
摘要: 
本文从宏观上介绍Smack类库的基本架构以及源代码的组织方式,并不会涉及太多的代码细节,如果你想从整体了解Smack,有必要一读。 

Smack 
在我看来可以分为三个基本层面(通讯层、协议层、核心Wrapper层),注:软件分层的看法各不同,可能我认为这样划分比较好,你也可能觉得你的划分更贴切, 但都没关系,随你的爱好吧,注:由于系统核心Wrapper层主要用到了Observer设计模式,如果对Observer模式不是很熟悉,请看我的一篇(Ob server设计模式)文章,里面有比较清晰的阐述。 
基本的通讯层采用Java 
传统I/O机制来实现,用实现消息的收发。 
协议层实现了基本的IQ、Presence、Message 等Jabber 
Packet,同时他也提供了一个让您扩展自定义协议的Provider 
机制。 
核心Wrapper 
层在我看来是逻辑最为复杂的一层,在这一层中有好几个亮点 
Filter 和Observer机制。 

总体结构概览: 

参考:Smack Overview  、Getting Started With Smack (Smack 
官方文档)。 

核心Wrapper 层 
Packet 的发送: 

用Smack发送一个Packet ,是将Packet 分别加入到queue 和 
sendPackets 队列中去,然后由 WriterThread 
这个线程将queue中的Packet 
发到Jabber服务器,而至于ListenerThread线程则是将sendPackets这个队列中的Packet 
交给Listeners中的监听器来监听处理,keepAliveThread 
这个线程看名字就知道,是用于发KeepAlive消息的,这里如果配置需要发送KeepAlive 
消息的话,那这个消息将会是一个空格并被定时发送给Jabber 
Server。 

参考 :Messaging using Chat and GroupChat (Smack 官方文档) 

Packet的接收: 

PacketReader 中启动两个线程来监控并操作从Socket 
中来的消息,一个是ReaderThread线程和一个ListenerThread 
线程,当消息到达Socket缓冲区的时候,ReaderThread 
会从Socket中解析这个消息,并将消息转换成适当的消息对象,并由这些特定Filter来过滤这些消息并保存到相应的收集器中(PacketCollect or)中去,然后由ListenerThread 
来将这些特定收集器中的Packet交由特定的Listener 
来处理,至于Filter 
我在这里没有细说,简单概况一下功能,过滤某一个或者某一些特定的Packet,如:AndFilter 
就是可以组合多个PacketFilter为一个Filter 
集合,当他们的过滤结果都为真的时候,才会截获这个Packet并将该Packet存储到PacketCollector中。 

下面给出Filter部分设计类图: 

参考:Processing Incoming Packets(Smack 官方文档) 

协议层: 
(1)     Packet 基本设计: 
协议层是我感觉设计的最为灵活的一层,尤其他的Provider 
Architecture非常到位,下面就先看一下org.jivesoftware.smack.packet 

包中的设计类图,这个我不作解释,这个类图已经能够说明问题了。 

另外一个org.jivesoftware.smackx.packet包都是Packet扩展。 

(2)     Packet 高级设计:(Provider Architecture) 
Provider 
的设计目的就是方便协议的扩充,提供简易的扩展Packet 
及扩展Packet 
Provider(解析类),下面是org.jivesoftware.smack.provider 
包类图: 

ProviderManager 用于管理我们扩展的所有Provider 
,且这些Packet 
Provider声明都是被定义在外部的META-INF/smack.providers文件中,初始化必须由ProviderManager来加载所有Pr ovider类,而至于扩展Packet的解析则是通过elementName 
和 namespace 来确定Packet Provider类。 

举例Jabber:iq:time 
Packet扩展(节选自smack.providers文件): 
    <!-- Time --> 
    <iqProvider> 
        <elementName>query</elementName> 
        <namespace>jabber:iq:time</namespace> 
        <className>org.jivesoftware.smackx.packet.Time</className> 
    </iqProvider> 
在org.jivesoftware.smackx.provider 包中都是扩展Packet 
Provider实现,(注: 
我所说的扩展Packet并不一定就代表这个Packet 
是自创的,Jabber 
发布的扩展协议,如果在这里用Provider 
机制来实现,在我看来这就叫扩展Packet)ProviderManager管理两种类型的Provider:一种是IQProvider 
-解析IQ请求,另一种则是PacketExtensionProvider 
-解析附加在Packet 中的XML子文档 。 

因为Smack  默认仅仅知道怎样处理IQ Packets 
以及下面这些扩展Packet,他们的namespaces如下: 
        jabber:iq:auth 
        jabber:iq:roster 
        jabber:iq:register 
所以我们会看到org.jivesoftware.smackx.provider 
包中都是用provider 
Architecture实现的扩展Packet解析或Packet本身。 

请看org.jivesoftware.smackx.provider 中的类图: 

Provider 
Architecture的实现我只能讲到这里,其实关于Provider 
Architecture说的最好的是官方文档,本想翻译出来,实在是怕本人的蹩脚英语,翻译出来的东西会伤害到您,所以大家伙就自己看英文吧! 

参考:Provider Architecture: Packet Extensions and Custom IQ's 

网络层: 
至于网络层我的确不知道怎么说好,在我看了就是通过传统Java 
I/O 
来获取Socket缓冲区消息,并通过Socket发送消息,没什么可说的。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多