`

Smack 体系结构

阅读更多

Smack 体系结构
Zhuam (zhuam... @gmail.com)
摘要:
本文从宏观上介绍Smack类库的基本架构以及源代码的组织方式,并不会涉及太多的代码细节,如果你想从整体了解Smack,有必要一读。

Smack
在我看来可以分为三个基本层面(通讯层、协议层、核心Wrapper层),注:软件分层的看法各不同,可能我认为这样划分比较好,你也可能觉得你的划分更贴切,但都没关系,随你的爱好吧,注:由于系统核心Wrapper层主要用到了Observer设计模式,如果对Observer模式不是很熟悉,请看我的一篇(Observer设计模式)文章,里面有比较清晰的阐述。
基本的通讯层采用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来过滤这些消息并保存到相应的收集器中(PacketCollector)中去,然后由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来加载所有Provider类,而至于扩展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发送消息,没什么可说的。

分享到:
评论
2 楼 z165153 2012-09-12  
想请问一下Message的packet是在哪个(provider)解析的?
1 楼 z165153 2012-09-12  
写的挺好的,学习了。

相关推荐

    smack4.3.1

    **Smack 4.3.1:Android 移动端即时通讯框架** Smack 是一个开源的、跨平台的即时通讯(IM)库,专为实现XMPP(Extensible Messaging and Presence Protocol)协议而设计。在Smack 4.3.1版本中,开发者能够利用这个...

    smack4.1.4 android 测试通过

    Smack 是一个开源的即时通讯库,主要用于实现XMPP(Extensible Messaging and Presence Protocol)协议。在Android平台上,开发者常使用Smack来构建聊天应用程序,因为它提供了丰富的API和功能,可以方便地创建...

    Smack中文文档,chm格式

    Smack中文文档Smack中文文档Smack中文文档Smack中文文档Smack中文文档Smack中文文档Smack中文文档Smack中文文档Smack中文文档Smack中文文档

    Smack文档中文版

    《Smack文档中文版》是针对Smack开源项目的详尽指南,主要面向开发者和IT专业人士。Smack是一个用Java编写的开源库,用于在XMPP(可扩展消息处理即时协议)上实现即时通讯功能。XMPP是一种基于XML的开放标准,广泛...

    smack api帮助文档

    Smack API 是一个开源的Java库,专门用于处理XMPP(可扩展消息处理推送协议)通信。这个API为开发者提供了一套丰富的接口和类,使得构建XMPP客户端应用程序变得简单而高效。它允许用户实现即时通讯(IM)、多用户...

    smack_接收文件实例

    首先,我们需要理解Smack库的基本结构。Smack提供了许多类和接口来处理XMPP连接、用户身份验证、消息发送与接收、以及文件传输等操作。核心组件包括`XMPPTCPConnection`,它负责建立和管理到XMPP服务器的TCP连接;`...

    Android使用smack连接ejabberd服务器注册、收发消息

    implementation 'org.igniterealtime.smack:smack-android-extensions:4.3.5' implementation 'org.igniterealtime.smack:smack-tcp:4.3.5' implementation 'org.igniterealtime.smack:smack-im:4.3.5' ...

    smack 3.2.2

    Smack 3.2.2 是一个专门针对Linux平台的XMPP(Extensible Messaging and Presence Protocol)库。XMPP是一种开放标准的即时通讯协议,它允许用户进行实时、双向通信,广泛应用于聊天应用、协作工具以及物联网设备...

    smack android

    Smack是一个开源的XMPP(eXtensible Messaging and Presence Protocol)库,广泛用于实现即时通讯和在线状态功能。在Android平台上,以往开发者通常需要使用Asmack,一个专门为Android优化的Smack版本,因为原版...

    smack包.zip

    "smack包.zip"就是这样一个工具包,它提供了在Android设备上实现XMPP(Extensible Messaging and Presence Protocol)协议的功能,从而让我们能够在基于Openfire服务器的环境中搭建起即时通讯系统。 XMPP是一种开放...

    smack 源码

    Smack 是一个开源的XMPP(Extensible Messaging and Presence Protocol)客户端库,广泛用于构建即时通讯(IM)应用。Openfire 是一个基于XMPP协议的服务器,两者常一起使用,为开发者提供完整的IM解决方案。本篇...

    Smack中文API文档

    Smack中文API文档

    XMPP Smack java 聊天程序

    Smack是XMPP的一个Java实现库,它为开发者提供了简单易用的API,方便构建XMPP应用。 在"XMPP Smack java 聊天程序"这个项目中,你将学习到如何使用Smack库在Java环境中创建一个基本的聊天应用。首先,你需要理解...

    smack中文文档

    Smack是一款开源的Java库,专门用于实现XMPP(可扩展消息传递和 Presence 协议)协议,它允许用户创建即时通讯应用。由于原始的Smack文档主要为英文,对于中文使用者来说,可能存在一定的理解障碍。然而,尽管这里的...

    smack类库详细介绍,【中文】

    Smack是一个开源的Java库,专门用于实现XMPP(Extensible Messaging and Presence Protocol)协议,这是一种基于XML的即时通讯协议。XMPP广泛应用于聊天、协作、物联网设备通信等多个领域。在本文中,我们将深入探讨...

    Smack帮助文档中文版

    Smack是一款开源的Java库,专门用于实现XMPP(Extensible Messaging and Presence Protocol)协议,它使得开发者可以轻松地在Java应用中构建实时通讯功能,如即时消息、群聊、在线状态管理和推送通知等。Openfire是...

    smack4.1.5依赖jar包以及demo

    Smack是一个开源的Java库,专门用于实现XMPP(可扩展消息传递和 Presence 协议),这是一种基于XML的协议,广泛用于即时通讯和在线状态管理。Smack4.1.5是该库的一个版本,提供了丰富的API来创建XMPP客户端、服务器...

    Smack源码,很有用

    Smack是一款开源的Java库,专门用于实现XMPP(Extensible Messaging and Presence Protocol)协议,这是一种基于XML的即时通讯协议。XMPP广泛应用于聊天、协作工具、物联网设备间通信等多种场景。通过研究Smack的...

    smack_3_3_0

    Smack是一个开源的XMPP(eXtensible Messaging and Presence Protocol)库,广泛用于实现即时通讯(IM)和在线状态服务。在Android平台上,开发者可以使用Smack与Openfire服务器进行交互,创建实时通信应用程序。...

Global site tag (gtag.js) - Google Analytics