1. 基本信息
1.1. Tigase架构
要理解的最重要的事情是Tigase是非常模块化的,您可以在单个实例中运行多个组件。然而,最重要的组件之一是 MessageRouter,它位于中心,顾名思义,它充当将数据包引导到适当组件的数据包路由器。
还有一组专门的组件负责处理用户连接:ConnectionManagers
(c2s
,s2s
,ws2s
,bosh
)。他们从传入连接接收数据包,然后将处理后的数据包转发到 MessageRouter
。大多数时候,特别是对于来自用户连接的数据包,数据包被路由到 SessionManager
组件(在客户端到服务器连接的情况下,会话对象引用适当的用户)。在 SessionManager
处理后,数据包返回到 MessageRouter
然后,根据节寻址,可以转到不同的组件(muc,pubsub),或者如果它被寻址到另一个用户,它可以通过:
SessionManager
(再次),MessageRouter
然后(用户)ConnectionManagers
或者,s2s
(服务器到服务器连接管理器)如果用户或组件在不同的,联合的,xmpp服务器上;
从一个非常广泛的角度来看,这可以用下图来描述:
1.2. Tigase服务器元素
为了更容易进入下面的代码,定义了Tigase服务器领域的基本术语,并简要说明了服务器是如何设计和实现的。本文档还为您指出可用作示例代码参考的基本接口和实现。
从逻辑上讲,所有服务器代码都可以分为3种模块:组件,插件 和 连接器。
组件 是Tigas 服务器的主要元素。组件是一段更大的代码,它可以有单独的地址,接收和发送节,并被配置为响应众多事件。为Tigase服务器实现的示例组件有:c2s 连接管理器,s2s 连接管理器,会话管理器,XEP-0114 - 外部组件连接管理器,MUC - 多用户字符室。
插件 通常是一小段代码,负责处理特定的XMPP节。他们没有自己的地址。作为节处理的结果,他们可以生成新的XMPP节。插件由 session manager 组件或 c2s connection manager 组件加载。示例插件是:vCard 节处理、jabber:iq:register 注册新用户帐户,presence 节处理和 用于非sasl身份验证的 jabber:iq:auth 。
连接器 是负责访问数据库或LDAP等数据存储库以存储和检索用户数据的模块。有两种连接器:身份验证连接器和用户数据连接器。它们都是独立的,可以连接到不同的数据源。示例连接器是:JDBC 数据库 连接器,XMLDB - 嵌入式数据库 连接器,Drupal 数据库 连接器。
为上述每种模块定义了一个API,您所要做的就是启用该特定接口的实现。然后可以根据其配置设置将该模块加载到服务器。还有可用的抽象类,实现这些接口以使开发更容易。
以下是要查看的所有接口的简要列表,有关更多详细信息,您须参考特定类型模块的指南。
1.2.1. 组件
这是处理新组件时要查看的接口列表:
tigase.server.ServerComponent - 这是组件的非常基本的接口。所有组件都必须实现它。
tigase.server.MessageReceiver - 该接口扩展了
ServerComponent
,并且需要由想要接收数据包的组件实现,例如 session manager 和 c2s connection manager。tigase.conf.Configurable - 需要实现此接口才能使其可配置。对于这种类型的每个对象,配置会在运行时随时推送给它。这对于在运行时更改配置是必要的。请小心正确实施,因为它可能会导致无法配置的模块出现问题。
tigase.disco.XMPPService - 使用此接口的对象可以响应 “ServiceDiscovery” 请求。
tigase.stats.StatisticsContainer - 使用此接口的对象可以返回运行时统计信息。任何对象都可以收集作业统计信息,并且实现此接口可确保统计信息以一致的方式呈现给想要查看它们的用户。
建议不要直接实现上述接口,而是扩展现有的抽象类之一,它可以处理大部分”又脏又无聊”的东西。以下是最有用的抽象类列表:
tigase.server.AbstractMessageReceiver - 实现 4 个基本接口:
ServerComponent
、MessageReceiver
、Configurable
和StatisticsContainer
。 AbstractMessageReceiver 还使用它自己的线程来管理内部数据队列,从而防止资源匮乏导致的死锁。它提供了事件驱动的数据处理,这意味着每当数据包到达时,都会调用abstract void processPacket(Packet packet);
方法来处理它。如果您的组件想要发送一个数据包(例如响应它收到的数据),您必须在您的组件中实现这个抽象方法。boolean addOutPacket(Packet packet)
tigase.server.ConnectionManager - 这是
AbstractMessageReceiver
抽象类的扩展。顾名思义,这个类负责所有网络连接管理。如果您的组件需要直接从网络发送和接收数据(如c2s连接,s2s连接或外部组件),您应该将此实现用作基本类。它负责与网络,I/O,重新连接,侦听套接字,连接等相关的所有事情。如果你扩展这个类,你必须期望数据来自以下源:从
MessageRouter
,这是当调用abstract void processPacket(Packet packet);
方法的时候,其次,从网络连接,然后是abstract Queue processSocketData(XMPPIOService serv);
方法被调用。
1.2.2. 插件
当前实现的所有Tigase插件都位于以下包中:tigase.xmpp.impl。您可以将此代码用作示例代码库。有3种类型的插件,它们在位于 tigase.xmpp
包中的接口中定义:
XMPPProcessorIfc - 最重要和最基本的插件。这是最常见的插件类型,仅在正常模式下处理节。它接收数据包,代表用户处理它们并返回结果节。
XMPPPreprocessorIfc - 此插件执行数据包的预处理,用于预处理器设置数据包阻塞。
XMPPPostprocessorIfc - 该插件对没有特定处理器的数据包进行处理。
1.3. 连接器
1.3.1. 数据,节,数据包 - 数据流和处理
从网络接收的数据通过 tigase.io
包中的代码从网络套接字读取为字节。然后字节被转换为 tigase.net
包类中的字符,并作为字符发送到 XML 解析器(tigase.xml
),后者将它们转换为XML DOM结构。
服务器内部的所有数据都以XML DOM形式交换,因为这是XMPP协议使用的格式。对于基本的XML数据处理(解析字符流、构建 DOM、操作 XML 元素和属性),我们使用 Tigase XML parser and DOM builder。
每个节都存储在 tigase.xml.Element
对象中。每个元素可以包含任意数量的 子元素 和任意数量的属性。您可以通过类API访问所有这些数据。
为了简化一些,最常见的操作元素被包在 tigase.server.Packet
类中,它为最常见的操作提供了另一个级别的API,比如基于它包含的元素准备响应节(交换到/从值,放入 type=result 属性和其他)。