启动流程

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连接。

openfire源码分析的更多相关文章

  1. Openfire源码阅读(一)

    本篇先分析openfire源码的主要流程,模块细节后续再继续分析: 一.简介: Openfire是开源的实时协作服务器(RTC),它是基于公开协议XMPP(RFC-3920),并在此基础上实现了XMP ...

  2. (转)OpenFire源码学习之十:连接管理(上)

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43415827 关于连接管理分为上下两部分 连接管理 在大并发环境下,连接资源 需要随着用 ...

  3. ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

  4. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

  5. nginx源码分析之网络初始化

    nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...

  6. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

  7. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  8. zookeeper源码分析之三客户端发送请求流程

    znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...

  9. java使用websocket,并且获取HttpSession,源码分析

    转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...

随机推荐

  1. IE8下jQuery改变png图片透明度时出现的黑边问题

    png24格式的图片在用jQuery添加显示隐藏动画时发现,图片的半透明区域出现黑边? 在网上搜了搜主要有以下几种办法: 1.把图片保存成PNG-8格式. 2.把背景色一起切入并保存为JPG格式. 以 ...

  2. HDU 1403 Longest Common Substring(后缀数组,最长公共子串)

    hdu题目 poj题目 参考了 罗穗骞的论文<后缀数组——处理字符串的有力工具> 题意:求两个序列的最长公共子串 思路:后缀数组经典题目之一(模版题) //后缀数组sa:将s的n个后缀从小 ...

  3. HDU 2671 Can't be easier(数学题,点关于直线对称)

    题目 //数学题//直线 y = k * x + b//直线 ax+by+c=0; 点 (x0,y0); 点到直线距离 d = (ax0+by0+c)/sqrt(a^2+b^2) /********* ...

  4. POJ 3982 序列(JAVA,简单,大数)

    题目 //在主类中 main 方法必须是 public static void 的,在 main 中调用非static类时会有警告信息, //可以先建立对象,然后通过对象调用方法: import ja ...

  5. POJ 2195

    #include<iostream>//by Chengdacaizi #include<stdio.h> #include<vector> #include< ...

  6. Android线程消息通信(一)

    Android在Java标准线程模型的基础上,提供了消息驱动机制,用于多线程之间的通信.基于消息驱动机制的线程通信模型陈伟线程消息通信.在标准线程模型中,线程执行完毕后便退出,而Android扩展了线 ...

  7. I/O复用:异步聊天

    一.I/O复用 在<TCP套接字编程>的同步聊天程序中,我们看到TCP客户同时处理两个输入:标准输入和TCP套接字.考虑在客户阻塞于标准输入fgets调用时,服务器进程被杀死,服务器TCP ...

  8. 深入浅出ES6(十一):生成器 Generators,续篇

    作者 Jason Orendorff  github主页  https://github.com/jorendorff 欢迎回到深入浅出ES6专栏,望你在ES6探索之旅中收获知识与快乐!程序员们在工作 ...

  9. group_concat

    分割字符串 group_concat(a.EvidencesID separator ',') as EvidencesID #在MySQL配置文件(my.ini)中默认无该配置项,使用默认值时,值为 ...

  10. Shell script for logging cpu and memory usage of a Linux process

    Shell script for logging cpu and memory usage of a Linux process http://www.unix.com/shell-programmi ...