在
ConnectionManagerImpl
中是通過調用
startClientListeners
方法來初始化和開始端口監聽的。

在
startClientListeners
方法使用的是
Apache
的
Mina
框架來實現網絡連接的,
Mina
框架的模式如下:
IoFilter
:
IoFilter
為
MINA
的功能擴展提供了接口。它攔截所有的
IO
事件進行事件的預處理和后處理。它與
Servlet
中的
filter
機制十分相似。多個
IoFilter
存放在
IoFilterChain
中
IoFilter
能夠實現以下功能:數據轉換,事件日志,性能檢測
在
Openfire
中主要用
filter
這種機制來進行數據轉換。
Protocol Codec Factory
:
Protocol Codec Factory
提供了方便的
Protocol
支持,通過它的
Encoder
和
Decoder
,可以方便的擴展并支持各種基于
Socket
的網絡協議,比如
HTTP
服務器、
FTP
服務器、
Telnet
服務器等等。
要實現自己的編碼
/
解碼器
(codec)
只需要實現
interface: ProtocolCodecFactory
即可,在
Openfire
中實現
ProtocolCodecFactory
的類為
XMPPCodecFactory
。
IoHandler
:
MINA
中,所有的業務邏輯都有實現了
IoHandler
的
class
完成
,當事件發生時,將觸發
IoHandler
中的方法
:
sessionCreated
sessionOpened
sessionClosed
sessionIdle
exceptionCaught
messageReceived
messageSent
在
Openfire
中客戶端和服務器連接的
IoHandler
實現類是
ClientConnectionHandler
,它是從
ConnectionHandler
中繼承來的。
startClientListeners
方法首先為
Mian
框架設置線程池,再將一個由
XMPPCodecFactory
作為
Protocol Codec Factory
的
Filter
放入到
FilterChain
中,
然后綁定到端口
5222
,并將
ClientConnectionHandler
作為
IoHandler
對數據進行處理。完成這些步驟后
Openfire
就在
5222
等待客戶端的連接。
客戶端連接的處理過程:
當有客戶端進行連接時根據
Mina
框架的模式首先調用的是
sessionOpened
方法。
sessionOpened
首先為此新連接構造了一個
parser
(
XMLLightWeightParser
),這個
parser
是專門給
XMPPDecoder
(是
XMPPCodecFactory
的解碼器類)
使用的,再創建一個
Openfire
的
Connection
類實例
connection
和一個
StanzaHandler
的實例。最后將以上的
parser, connection
和
StanzaHandler
的實例存放在
Mina
的
session
中,以便以后使用。
當有數據發送過來時,
Mina
框架會調用
messageReceived
方法
messageReceived
首先從
Mina
的
session
中得到在
sessionOpened
方法中創建的
StanzaHandler
實例
handler
,然后從
parsers
中得到一個
parser
(如果
parsers
中沒有可以創建一個新的實例)(注意這個
parser
和在
sessionOpened
方法中創建的
parser
不同,這個
parser
是用來處理
Stanza
的,而在
sessionOpened
方法中創建的
parser
是在
filter
中用來解碼的,一句話說就是在
sessionOpened
方法中創建的
parser
是更低一層的
parser
)。最后將
xml
數據包交給
StanzaHander
的實例
hander
進行處理。
StanzaHander的實例hander處理xml數據包的過程
StanzaHander
首先判斷
xml
數據包的類型,
.
如果數據包以“
<stream:stream
”打頭那么說明客戶端剛剛連接,需要初始化通信(符合
XMPP
協議)
Openfire
首先為此客戶端建立一個與客戶端
JID
相關的
ClientSession
,而后與客戶端交互協商例如是否使用
SSL
,是否使用壓縮等問題。當協商完成之后進入正常通信階段,則可以將
xml
數據包交給這個用戶的
ClientSession
進行派送(
deliever
),經過派送數據包可以發送給
PacketRouteImpl
模塊進行處理。
----------------------------------------------------------------------------------------------------------------------------------------------------
結點類包
起點 org.jivesoftware.openfire.starter.ServerStarter
服務器 org.jivesoftware.openfire.XMPPServer
用戶驗證包 里面有AuthProvier接口、幾個實現類。。。
org.jivesoftware.openfire.auth
用戶 org.jivesoftware.openfire.user
組 org.jivesoftware.openfire.group
好友列表org.jivesoftware.openfire.roster
開發插件會用到的接口和包
org.jivesoftware.openfire.container.Plugins
org.xmpp.component.Component
org.jivesoftware.openfire.event
org.jivesoftware.openfire.handler
攔截器
org.jivesoftware.openfire.interceptor