zoukankan      html  css  js  c++  java
  • openfire源码分析

    启动流程

     

    Socket接口

    Socket通信使用Mina框架实现,是XMPP协议的处理入口,具体为:

     

    消息接收后由不同的节处理器处理:

     

    StanzaHandler基础消息类型,之后进行消息路由:

     

    最后通过路由表进行路由:

     

    Http接口

    Http接口用于Web端的管理以及Web客户端的通信,使用jetty实现。

    通过XMPServer启动ConectionManager来管理链接启动,包括SSL,HTTP,TCP等。

    消息处理流程

     

    消息发送

    消息的发送通过NIOConnection.deliver(Packet packet)实现。

     

    模块功能列表

    启动模块

    RoutingTableImpl

    /**

     * Routing table that stores routes to client sessions, outgoing server sessions

     * and components. As soon as a user authenticates with the server its client session

     * will be added to the routing table. Whenever the client session becomes available

     * or unavailable the routing table will be updated too.<p>

     *

     * When running inside of a cluster the routing table will also keep references to routes

     * hosted in other cluster nodes. A {@link RemotePacketRouter} will be use to route packets

     * to routes hosted in other cluster nodes.<p>

     *

     * Failure to route a packet will end up sending {@link IQRouter#routingFailed(JID, Packet)},

     * {@link MessageRouter#routingFailed(JID, Packet)} or {@link PresenceRouter#routingFailed(JID, Packet)}

     * depending on the packet type that tried to be sent.

     *

     * @author Gaston Dombiak

     */

    AuditManager

    /**

     * Manages and directs server message auditing behavior. Turning on

     * all auditing options can produce copious amounts of data and

     * significantly slow the server as it saves the data to persistent storage.<p>

     *

     * Auditing currently saves audit data to a raw XML file

     * which can later be processed and mined for information.

     *

     * @author Iain Shigeoka

     */

    RostManager

    /**

     * A simple service that allows components to retrieve a roster based solely on the ID

     * of the owner. Users have convenience methods for obtaining a roster associated with

     * the owner. However there are many components that need to retrieve the roster

     * based solely on the generic ID owner key. This interface defines a service that can

     * do that. This allows classes that generically manage resource for resource owners

     * (such as presence updates) to generically offer their services without knowing or

     * caring if the roster owner is a user, chatbot, etc.

     *

     * @author Iain Shigeoka

     */

    PluginManager

    /**

     * Loads and manages plugins. The <tt>plugins</tt> directory is monitored for any

     * new plugins, and they are dynamically loaded.

     *

     * <p>An instance of this class can be obtained using:</p>

     *

     * <tt>XMPPServer.getInstance().getPluginManager()</tt>

     *

     * @author Matt Tucker

     * @see Plugin

     * @see org.jivesoftware.openfire.XMPPServer#getPluginManager()

     */

    核心模块

    PresenceManagerImpl

    /**

     * The presence manager tracks on a global basis who's online. The presence

     * monitor watches and reports on what users are present on the server, and

     * in other jabber domains that it knows about. The presence manager does

     * not know about invisible users (they are invisible).

     *

     * @author Iain Shigeoka

     */

    SessionManager

    /**

     * Manages the sessions associated with an account. The information

     * maintained by the Session manager is entirely transient and does

     * not need to be preserved between server restarts.

     *

     * @author Derek DeMoro

     */

    PacketRouterImpl

    /**

     * A router that handles incoming packets. Packets will be routed to their

     * corresponding handler. A router is much like a forwarded with some logic

     * to figute out who is the target for each packet.

     *

     * @author Gaston Dombiak

     */

    IQRouter

    /**

     * Routes iq packets throughout the server. Routing is based on the recipient

     * and sender addresses. The typical packet will often be routed twice, once

     * from the sender to some internal server component for handling or processing,

     * and then back to the router to be delivered to it's final destination.

     *

     * @author Iain Shigeoka

     */

    MessageRouter

    /**

     * <p>Route message packets throughout the server.</p>

     * <p>Routing is based on the recipient and sender addresses. The typical

     * packet will often be routed twice, once from the sender to some internal

     * server component for handling or processing, and then back to the router

     * to be delivered to it's final destination.</p>

     *

     * @author Iain Shigeoka

     */

    PresenceRouter

    /**

     * <p>Route presence packets throughout the server.</p>

     * <p>Routing is based on the recipient and sender addresses. The typical

     * packet will often be routed twice, once from the sender to some internal

     * server component for handling or processing, and then back to the router

     * to be delivered to it's final destination.</p>

     *

     * @author Iain Shigeoka

     */

    MulticastRouter

    将一个包路由到多个目的地址,包括远程地址,但只获取深度为1的地址。

    /**

     * Router of packets with multiple recipients. Clients may send a single packet with multiple

     * recipients and the server will broadcast the packet to the target receipients. If recipients

     * belong to remote servers, then this server will discover if remote target servers support

     * multicast service. If a remote server supports the multicast service, a single packet will be

     * sent to the remote server. If a remote server doesn't the support multicast

     * processing, the local server sends a copy of the original stanza to each address.<p>

     *

     * The current implementation will only search up to the first level of nodes of remote servers

     * when trying to find out if remote servers have support for multicast service. It is assumed

     * that it is highly unlikely for servers to have a node in the second or third depth level

     * providing the multicast service. Servers should normally provide this service themselves or

     * at least as a first level node.

     *

     * This is an implementation of <a href=http://www.jabber.org/jeps/jep-0033.html>

     * JEP-0033: Extended Stanza Addressing</a>

     *

     * @author Matt Tucker

     */

    PacketTransporterImpl

    /**

     * In-memory implementation of the packet transporter service.

     *

     * @author Iain Shigeoka

     */

    PacketDelivererImpl

    /**

     * In-memory implementation of the packet deliverer service

     *

     * @author Iain Shigeoka

     */

    TransportHandler

    /**

     * Routes packets to the appropriate transport gateway or drops the packet.

     *

     * @author Iain Shigeoka

     */

    OfflineMessageStrategy

    /**

     * Controls what is done with offline messages.

     *

     * @author Iain Shigeoka

     */

    OfflineMessageStore

    /**

     * Represents the user's offline message storage. A message store holds messages that were

     * sent to the user while they were unavailable. The user can retrieve their messages by

     * setting their presence to "available". The messages will then be delivered normally.

     * Offline message storage is optional, in which case a null implementation is returned that

     * always throws UnauthorizedException when adding messages to the store.

     *

     * @author Iain Shigeoka

     */

    VCardManager

    电子名片管理器

    /**

     * Manages VCard information for users.

     *

     * @author Matt Tucker

     */

    标准模块

    IQBindHandler

    /**

     * Binds a resource to the stream so that the client's address becomes a full JID. Once a resource

     * has been binded to the session the entity (i.e. client) is considered a "connected resource".

     * <p>

     * Clients may specify a desired resource but if none was specified then the server will create

     * a random resource for the session. The new resource should be in accordance with ResourcePrep.

     * The server will also verify if there are previous sessions from the same user that are already

     * using the resource specified by the user. Depending on the server configuration the old session

     * may be kicked or the new session may be rejected.</p>

     *

     * @author Gaston Dombiak

     */

    IQSessionEstablishmentHandler

    /**

     * Activate client sessions once resource binding has been done. Clients need to active their

     * sessions in order to engage in instant messaging and presence activities. The server may

     * deny sessions activations if the max number of sessions in the server has been reached or

     * if a user does not have permissions to create sessions.<p>

     *

     * Current implementation does not check any of the above conditions. However, future versions

     * may add support for those checkings.

     *

     * @author Gaston Dombiak

     */

    IQAuthHandler

    /**

     * Implements the TYPE_IQ jabber:iq:auth protocol (plain only). Clients

     * use this protocol to authenticate with the server. A 'get' query

     * runs an authentication probe with a given user name. Return the

     * authentication form or an error indicating the user is not

     * registered on the server.<p>

     *

     * A 'set' query authenticates with information given in the

     * authentication form. An authenticated session may reset their

     * authentication information using a 'set' query.

     *

     * <h2>Assumptions</h2>

     * This handler assumes that the request is addressed to the server.

     * An appropriate TYPE_IQ tag matcher should be placed in front of this

     * one to route TYPE_IQ requests not addressed to the server to

     * another channel (probably for direct delivery to the recipient).

     *

     * @author Iain Shigeoka

     */

    IQPingHandler

    /**

     * Implements the XMPP Ping as defined by XEP-0199. This protocol offers an

     * alternative to the traditional 'white space ping' approach of determining the

     * availability of an entity. The XMPP Ping protocol allows pings to be

     * performed in a more XML-friendly approach, which can be used over more than

     * one hop in the communication path.

     *

     * @author Guus der Kinderen

     * @see <a href="http://www.xmpp.org/extensions/xep-0199.html">XEP-0199:XMPP Ping</a>

     */

    IQPrivateHandler

    /**

     * Implements the TYPE_IQ jabber:iq:private protocol. Clients

     * use this protocol to store and retrieve arbitrary application

     * configuration information. Using the server for setting storage

     * allows client configurations to follow users where ever they go.

     * <p>

     * A 'get' query retrieves any stored data.

     * A 'set' query stores new data.

     * </p>

     * <p>

     * Currently an empty implementation to allow usage with normal

     * clients. Future implementation needed.

     * </p>

     * <h2>Assumptions</h2>

     * This handler assumes that the request is addressed to the server.

     * An appropriate TYPE_IQ tag matcher should be placed in front of this

     * one to route TYPE_IQ requests not addressed to the server to

     * another channel (probably for direct delivery to the recipient).

     * <h2>Warning</h2>

     * There should be a way of determining whether a session has

     * authorization to access this feature. I'm not sure it is a good

     * idea to do authorization in each handler. It would be nice if

     * the framework could assert authorization policies across channels.

     *

     * @author Iain Shigeoka

     */

    IQRegisterHandler

    完成新用户注册功能。

    /**

     * Implements the TYPE_IQ jabber:iq:register protocol (plain only). Clients

     * use this protocol to register a user account with the server.

     * A 'get' query runs a register probe to obtain the fields needed

     * for registration. Return the registration form.

     * A 'set' query attempts to create a new user account

     * with information given in the registration form.

     * <h2>Assumptions</h2>

     * This handler assumes that the request is addressed to the server.

     * An appropriate TYPE_IQ tag matcher should be placed in front of this

     * one to route TYPE_IQ requests not addressed to the server to

     * another channel (probably for direct delivery to the recipient).

     * <h2>Compatibility</h2>

     * The current behavior is designed to emulate jabberd1.4. However

     * this behavior differs significantly from JEP-0078 (non-SASL registration).

     * In particular, authentication (IQ-Auth) must return an error when a user

     * request is made to an account that doesn't exist to trigger auto-registration

     * (JEP-0078 explicitly recommends against this practice to prevent hackers

     * from probing for legitimate accounts).

     *

     * @author Iain Shigeoka

     */

    IQRosterHandler

    /**

     * Implements the TYPE_IQ jabber:iq:roster protocol. Clients

     * use this protocol to retrieve, update, and rosterMonitor roster

     * entries (buddy lists). The server manages the basics of

     * roster subscriptions and roster updates based on presence

     * and iq:roster packets, while the client maintains the user

     * interface aspects of rosters such as organizing roster

     * entries into groups.

     * <p>

     * A 'get' query retrieves a snapshot of the roster.

     * A 'set' query updates the roster (typically with new group info).

     * The server sends 'set' updates asynchronously when roster

     * entries change status.

     * </p>

     * <p>

     * Currently an empty implementation to allow usage with normal

     * clients. Future implementation needed.</p>

     * <h2>Assumptions</h2>

     * This handler assumes that the request is addressed to the server.

     * An appropriate TYPE_IQ tag matcher should be placed in front of this

     * one to route TYPE_IQ requests not addressed to the server to

     * another channel (probably for direct delivery to the recipient).

     * <h2>Warning</h2>

     * There should be a way of determining whether a session has

     * authorization to access this feature. I'm not sure it is a good

     * idea to do authorization in each handler. It would be nice if

     * the framework could assert authorization policies across channels.

     *

     * @author Iain Shigeoka

     */

    IQTimeHandler

    /**

     * Implements the TYPE_IQ jabber:iq:time protocol (time info) as

     * as defined by JEP-0090. Allows Jabber entities to query each

     * other's local time.  The server will respond with its local time.

     * <h2>Assumptions</h2>

     * This handler assumes that the time request is addressed to itself.

     * An appropriate TYPE_IQ tag matcher should be placed in front of this

     * one to route TYPE_IQ time requests not addressed to the server to

     * another channel (probably for direct delivery to the recipient).

     * <h2>Warning</h2>

     * There should be a way of determining whether a session has

     * authorization to access this feature. I'm not sure it is a good

     * idea to do authorization in each handler. It would be nice if

     * the framework could assert authorization policies across channels.

     *

     * @author Iain Shigeoka

     */

    IQEntityTimeHandler

    /**

     * This IQ handler implements XEP-0202: Entity Time.

     */

    IQvCardHandler

    /**

     * Implements the TYPE_IQ vcard-temp protocol. Clients

     * use this protocol to set and retrieve the vCard information

     * associated with someone's account.

     * <p>

     * A 'get' query retrieves the vcard for the addressee.

     * A 'set' query sets the vcard information for the sender's account.

     * </p>

     * <p>

     * Currently an empty implementation to allow usage with normal

     * clients. Future implementation needed.

     * </p>

     * <h2>Assumptions</h2>

     * This handler assumes that the request is addressed to the server.

     * An appropriate TYPE_IQ tag matcher should be placed in front of this

     * one to route TYPE_IQ requests not addressed to the server to

     * another channel (probably for direct delivery to the recipient).

     * <h2>Warning</h2>

     * There should be a way of determining whether a session has

     * authorization to access this feature. I'm not sure it is a good

     * idea to do authorization in each handler. It would be nice if

     * the framework could assert authorization policies across channels.

     * <h2>Warning</h2>

     * I have noticed incompatibility between vCard XML used by Exodus and Psi.

     * There is a new vCard standard going through the JSF JEP process. We might

     * want to start either standardizing on clients (probably the most practical),

     * sending notices for non-conformance (useful),

     * or attempting to translate between client versions (not likely).

     *

     * @author Iain Shigeoka

     */

    IQVersionHandler

    /**

     * Implements the TYPE_IQ jabber:iq:version protocol (version info). Allows

     * XMPP entities to query each other's application versions.  The server

     * will respond with its current version info.

     *

     * @author Iain Shigeoka

     */

    IQLastActivityHandler

    /**

     * Implements the TYPE_IQ jabber:iq:last protocol (last activity). Allows users to find out

     * the number of seconds another user has been offline. This information is only available to

     * those users that already subscribed to the users presence. Otherwhise, a <tt>forbidden</tt>

     * error will be returned.

     *

     * @author Gaston Dombiak

     */

    PresenceSubscribeHandler

    /**

     * Implements the presence protocol. Clients use this protocol to

     * update presence and roster information.

     * <p>

     * The handler must properly detect the presence type, update the user's roster,

     * and inform presence subscribers of the session's updated presence

     * status. Presence serves many purposes in Jabber so this handler will

     * likely be the most complex of all handlers in the server.</p>

     * <p>

     * There are four basic types of presence updates:</p>

     * <ul>

     * <li>Simple presence updates - addressed to the server (or to address), these updates

     * are properly addressed by the server, and multicast to

     * interested subscribers on the user's roster. An empty, missing,

     * or "unavailable" type attribute indicates a simple update (there

     * is no "available" type although it should be accepted by the server.

     * <li>Directed presence updates - addressed to particular jabber entities,

     * these presence updates are properly addressed and directly delivered

     * to the entity without broadcast to roster subscribers. Any update type

     * is possible except those reserved for subscription requests.

     * <li>Subscription requests - these updates request presence subscription

     * status changes. Such requests always affect the roster.  The server must:

     * <ul>

     * <li>update the roster with the proper subscriber info

     * <li>push the roster changes to the user

     * <li>forward the update to the correct parties.

     * </ul>

     * The valid types include "subscribe", "subscribed", "unsubscribed",

     * and "unsubscribe".

     * <li>XMPPServer probes - Provides a mechanism for servers to query the presence

     * status of users on another server. This allows users to immediately

     * know the presence status of users when they come online rather than way

     * for a presence update broadcast from the other server or tracking them

     * as they are received.  Requires S2S capabilities.

     * </ul>

     * <h2>Warning</h2>

     * There should be a way of determining whether a session has

     * authorization to access this feature. I'm not sure it is a good

     * idea to do authorization in each handler. It would be nice if

     * the framework could assert authorization policies across channels.

     *

     * @author Iain Shigeoka

     */

    PresenceUpdateHandler

    /**

     * Implements the presence protocol. Clients use this protocol to

     * update presence and roster information.

     * <p>

     * The handler must properly detect the presence type, update the user's roster,

     * and inform presence subscribers of the session's updated presence

     * status. Presence serves many purposes in Jabber so this handler will

     * likely be the most complex of all handlers in the server.

     * </p>

     * <p>

     * There are four basic types of presence updates:

     * </p>

     * <ul>

     * <li>Simple presence updates - addressed to the server (or to address), these updates

     * are properly addressed by the server, and multicast to

     * interested subscribers on the user's roster. An empty, missing,

     * or "unavailable" type attribute indicates a simple update (there

     * is no "available" type although it should be accepted by the server.

     * <li>Directed presence updates - addressed to particular jabber entities,

     * these presence updates are properly addressed and directly delivered

     * to the entity without broadcast to roster subscribers. Any update type

     * is possible except those reserved for subscription requests.

     * <li>Subscription requests - these updates request presence subscription

     * status changes. Such requests always affect the roster.  The server must:

     * <ul>

     * <li>update the roster with the proper subscriber info

     * <li>push the roster changes to the user

     * <li>forward the update to the correct parties.

     * </ul>

     * The valid types include "subscribe", "subscribed", "unsubscribed",

     * and "unsubscribe".

     * <li>XMPPServer probes - Provides a mechanism for servers to query the presence

     * status of users on another server. This allows users to immediately

     * know the presence status of users when they come online rather than way

     * for a presence update broadcast from the other server or tracking them

     * as they are received.  Requires S2S capabilities.

     * </ul>

     *

     * @author Iain Shigeoka

     */

    IQOfflineMessagesHandler

    /**

     * Implements JEP-0013: Flexible Offline Message Retrieval. Allows users to request number of

     * messages, request message headers, retrieve specific messages, remove specific messages,

     * retrieve all messages and remove all messages.

     *

     * @author Gaston Dombiak

     */

    IQPEPHandler

    /**

     * <p>

     * An {@link IQHandler} used to implement XEP-0163: "Personal Eventing via Pubsub"

     * Version 1.0

     * </p>

     *

     * <p>

     * For each user on the server there is an associated {@link PEPService} interacting

     * with a single {@link PubSubEngine} for managing the user's PEP nodes.

     * </p>

     *

     * <p>

     * An IQHandler can only handle one namespace in its IQHandlerInfo. However, PEP

     * related packets are seen having a variety of different namespaces. Thus,

     * classes like {@link IQPEPOwnerHandler} are used to forward packets having these other

     * namespaces to {@link IQPEPHandler#handleIQ(IQ)}.

     * <p>

     *

     * <p>

     * This handler is used for the following namespaces:</p>

     * <ul>

     * <li><i>http://jabber.org/protocol/pubsub</i></li>

     * <li><i>http://jabber.org/protocol/pubsub#owner</i></li>

     * </ul>

     *

     * @author Armando Jagucki

     * @author Guus der Kinderen, guus.der.kinderen@gmail.com

     */

    IQPEPOwnHandler

    /**

     * <p>

     * An {@link IQHandler} used to implement XEP-0163: "Personal Eventing via Pubsub"

     * Version 1.0

     * </p>

     *

     * <p>

     * An IQHandler can only handle one namespace in its IQHandlerInfo. However, PEP

     * related packets are seen having a variety of different namespaces. This

     * handler is needed to forward IQ packets with the

     * <i>'http://jabber.org/protocol/pubsub#owner'</i> namespace to IQPEPHandler.

     * </p>

     *

     * @author Armando Jagucki

     *

     */

    MulticastDNSService

    /**

     * Publishes Openfire information as a service using the Multicast DNS (marketed by Apple

     * as Rendezvous) protocol. This lets other nodes on the local network to discover

     * the name and port of Openfire.<p>

     *

     * The multicast DNS entries published:<ul>

     *  <li>Client connections: type of "_xmpp-client._tcp.local.".

     *  <li>Component connections: type of "_xmpp-component._tcp.local.".

     * </ul>

     *

     * @author Matt Tucker

     */

    IQShareGroupHandler

    /**

     * Handler of IQ packets whose child element is "sharedgroup" with namespace

     * "http://www.jivesoftware.org/protocol/sharedgroup". This handler will return the list of

     * shared groups where the user sending the request belongs.

     *

     * @author Gaston Dombiak

     */

    AdHocCommandHandler

    /**

     * An AdHocCommandHandler is responsbile for providing discoverable information about the

     * supported commands and for handling commands requests. This is an implementation of JEP-50:

     * Ad-Hoc Commands.<p>

     *

     * Ad-hoc commands that require user interaction will have one or more stages. For each stage the

     * user will complete a data form and send it back to the server. The data entered by the user is

     * kept in a SessionData. Instances of {@link AdHocCommand} are stateless. In order to prevent

     * "bad" users from consuming all system memory there exists a limit of simultaneous commands that

     * a user might perform. Configure the system property <tt>"xmpp.command.limit"</tt> to control

     * this limit. User sessions will also timeout and their data destroyed if they have not been

     * executed within a time limit since the session was created. The default timeout value is 10

     * minutes. The timeout value can be modified by setting the system property

     * <tt>"xmpp.command.timeout"</tt>.<p>

     *

     * New commands can be added dynamically by sending the message {@link #addCommand(AdHocCommand)}.

     * The command will immediatelly appear in the disco#items list and might be executed by those

     * users with enough execution permissions.

     *

     * @author Gaston Dombiak

     */

    IQPrivacyHandler

    /**

     * IQPrivacyHandler is responsible for handling privacy lists.

     *

     * @author Gaston Dombiak

     */

    DefaultFileTransferManager

    /**

     * Provides several utility methods for file transfer manager implementaions to utilize.

     *

     * @author Alexander Wenckus

     */

    FileTransferProxy

    /**

     * Manages the transfering of files between two remote entities on the jabber network.

     * This class acts independtly as a Jabber component from the rest of the server, according to

     * the Jabber <a href="http://www.jabber.org/jeps/jep-0065.html">SOCKS5 bytestreams protocol</a>.

     *

     * @author Alexander Wenckus

     */

    MediaProxyService

    /**

     * A proxy service for UDP traffic such as RTP. It provides Jingle transport candidates

     * to be used for media transmission. The media proxy is especially useful for users

     * behind NAT devices or firewalls that prevent peer to peer communication..

     *

     * @author Thiago Camargo

     */

    PubSubModule

    /**

     * Module that implements JEP-60: Publish-Subscribe. By default node collections and

     * instant nodes are supported.

     *

     * @author Matt Tucker

     */

    IQDiscoInfoHandler

    /**

     * IQDiscoInfoHandler is responsible for handling disco#info requests. This class holds a map with

     * the main entities and the associated DiscoInfoProvider. We are considering the host of the

     * recipient JIDs as main entities. It's the DiscoInfoProvider responsibility to provide information

     * about the JID's name together with any possible requested node.

     * <p>

     * For example, let's have in the entities map the following entries: "localhost" and

     * "conference.localhost". Associated with each entry we have different DiscoInfoProviders. Now we

     * receive a disco#info request for the following JID: "room@conference.localhost" which is a disco

     * request for a MUC room. So IQDiscoInfoHandler will look for the DiscoInfoProvider associated

     * with the JID's host which in this case is "conference.localhost". Once we have located the

     * provider we will delegate to the provider the responsibility to provide the info specific to

     * the JID's name which in this case is "room". Among the information that a room could provide we

     * could find its identity and the features it supports (e.g. 'muc_passwordprotected',

     * 'muc_unmoderated', etc.). Finally, after we have collected all the information provided by the

     * provider we will add it to the reply. On the other hand, if no provider was found or the provider

     * has no information for the requested name/node then a not-found error will be returned.</p>

     *

     * @author Gaston Dombiak

     */

    IQDiscoItemsHandler

    /**

     * IQDiscoItemsHandler is responsible for handling disco#items requests. This class holds a map with

     * the main entities and the associated DiscoItemsProvider. We are considering the host of the

     * recipient JIDs as main entities. It's the DiscoItemsProvider responsibility to provide the items

     * associated with the JID's name together with any possible requested node.

     * <p>

     * For example, let's have in the entities map the following entries: "localhost" and

     * "conference.localhost". Associated with each entry we have different DiscoItemsProvider. Now we

     * receive a disco#items request for the following JID: "room@conference.localhost" which is a disco

     * request for a MUC room. So IQDiscoItemsHandler will look for the DiscoItemsProvider associated

     * with the JID's host which in this case is "conference.localhost". Once we have located the

     * provider we will delegate to the provider the responsibility to provide the items specific to

     * the JID's name which in this case is "room". Depending on the implementation, the items could be

     * the list of existing occupants if that information is publicly available. Finally, after we have

     * collected all the items provided by the provider we will add them to the reply. On the other

     * hand, if no provider was found or the provider has no information for the requested name/node

     * then a not-found error will be returned.</p>

     * <p>

     * Publishing of client items is still not supported.

     * </p>

     *

     * @author Gaston Dombiak

     */

    UpdateManager

    /**

     * Service that frequently checks for new server or plugins releases. By default the service

     * will check every 48 hours for updates. Use the system property <tt>update.frequency</tt>

     * to set new values.

     * <p>

     * New versions of plugins can be downloaded and installed. However, new server releases

     * should be manually installed.</p>

     *

     * @author Gaston Dombiak

     */

    FlashCrossDomainHandler

    Flash跨域访问相关

    InternalComponentManager

    /**

     * Manages the registration and delegation of Components. The ComponentManager

     * is responsible for managing registration and delegation of {@link Component Components},

     * as well as offering a facade around basic server functionallity such as sending and

     * receiving of packets.<p>

     *

     * This component manager will be an internal service whose JID will be component.[domain]. So the

     * component manager will be able to send packets to other internal or external components and also

     * receive packets from other components or even from trusted clients (e.g. ad-hoc commands).

     *

     * @author Derek DeMoro

     */

    MultiUserChatManager

    /**

     * Provides centralized management of all configured Multi User Chat (MUC) services.

     *

     * @author Daniel Henninger

     */

    ClearSpaceManager

    /**

     * Centralized administration of Clearspace connections. The {@link #getInstance()} method

     * should be used to get an instance. The following properties configure this manager:

     * <ul>

     * <li>clearspace.uri</li>

     * <li>clearspace.sharedSecret</li>

     * </ul>

     *

     * @author Daniel Henninger

     */

    IQMessageCarbonsHanders

    IQ消息副本处理器

    /**

     * This handler manages XEP-0280 Message Carbons.

     *

     * @author Christian Schudt

     */

    ConnectionManagerImpl

    连接管理器,包括管理S2S连接,client连接,compoment连接,multiplexer连接。

  • 相关阅读:
    HDFS Java Client对hdfs文件增删查改
    Linux du查询文件大小
    Algorithms(4th)谢路云译大纲总结(附实现源码)
    百度开源e-chart初探
    由于java.util.Arrays.asList(...)导致的异常
    插入排序(1)——直接插入排序(insert sort)
    选择排序(2)——堆排序(heap sort)
    选择排序(1)——简单选择排序(selection sort)
    交换排序(2)——冒泡排序(bubble sort)
    ※交换排序(1)——快速排序(quick sort)
  • 原文地址:https://www.cnblogs.com/jiyuqi/p/5086215.html
Copyright © 2011-2022 走看看