openfire開發(fā)文檔
版本:Openfire3.5.

摘自:IM即時(shí)通訊研究

    目  

一、初始工作···············

1 、安裝 jdk1.5

2 、安裝 eclipse,myeclipse

3 、安裝 oracle10gXE

4 、安裝 openfire3.5.1 源代碼

二、環(huán)境配置···············

1 、配置 java 環(huán)境

2 、配置 openfire 運(yùn)行環(huán)境

三、代碼研究···············


第一章:初始工作

1.1 安裝 jdk1.5

方法1:放在F盤的安裝程序的java開發(fā)工具文件夾里

    方法2:可從www.sun.com.cn下載jdk1.5.

1.2 安裝 eclipse3.3,myeclipse6.0

     放在F盤的安裝程序的java開發(fā)工具文件夾里

1.3 安裝 oracle10gXE

     放在F盤的安裝程序的java開發(fā)工具文件夾里

1.4 安裝 openfire3.5.1 源代碼

        源代碼的下載

方法1:放在F盤的openfire文件夾里

方法2:可從openfire的官方網(wǎng)站下載,網(wǎng)址在IE的收藏夾里

②源代碼的安裝

將下載好的 openfire 源代碼解壓出來(lái),復(fù)制到 eclipse workspace 里, 打開eclipse,點(diǎn)新建java工程,在Contents里選擇第二個(gè),即Create project from existing source, Directory選項(xiàng)里點(diǎn)右邊的Browse按鈕,選擇eclipseworkspace里的openfire文件夾(這個(gè)文件夾的名字應(yīng)該叫:openfire_src),點(diǎn)確定。再填入Project name,工程名字一定要和eclipseworkspace里的openfire源代碼的文件夾名字相同,如下圖所示:

點(diǎn)擊完成,即成功導(dǎo)入openfire源代碼到eclipse中。如下圖所示:

右擊工程,點(diǎn)屬性->Java Build Path ->Libraries加入所對(duì)應(yīng)的測(cè)試jar包,叫test什么什么的,放在E盤里。點(diǎn)擊完成,即可將錯(cuò)誤消除。

第二章:環(huán)境配置

2.1 、配置 java 環(huán)境

    我的電腦點(diǎn)右鍵,選擇“屬性”。

選擇“高級(jí)”標(biāo)簽。

進(jìn)入環(huán)境變量設(shè)置:

分別設(shè)置如下三個(gè)環(huán)境變量:
PATH=C:"jdk1.6.0"bin
CLASSPATH=.;%JAVA_HOME%"lib"tools.jar;%JAVA_HOME%"lib"dt.jar(注意,CLASSPATH最前面是有個(gè)“.”的,表示當(dāng)前目錄)
JAVA_HOME=C:"jdk1.6.0

設(shè)置完成之后,我們來(lái)測(cè)試一下。開始-》運(yùn)行,輸入“CMD”,回車。

在打開的DOS命令窗口中輸入“java -version”,回車。

如果能像上圖那樣顯示JDK的版本,說(shuō)明“PATH”變量設(shè)置沒(méi)有問(wèn)題,如果有問(wèn)題,檢查PATH變量設(shè)置,輸入“echo %PATH%”。

看其中是否存在“C:"jdk1.6.0"bin”。如果不存在則返回到環(huán)境變量設(shè)置中檢查。

接下來(lái)我們編寫一個(gè)簡(jiǎn)單的Java程序測(cè)試CLASSPATH是否設(shè)置正確。

打開記事本,輸入下面的內(nèi)容,保存至C:"java目錄下,文件名為HelloWorld.java。(注意大小寫)

class HelloWorld{
public static void main(String[] arg){
System.out.println("HelloWorld");
}
}

在打開的DOS命令窗口,進(jìn)入C:"java,輸入“java HelloWorld.java”,回車。

這時(shí)在C:"java目錄下多了一個(gè)“HelloWorld.class”的文件。

在打開DOS命令窗口,輸入“java HelloWorld”,回車。

如果程序沒(méi)錯(cuò),那么將輸出“HelloWorld”。

恭喜,你的Java環(huán)境配置成功了。

2.2 、配置 openfire 運(yùn)行環(huán)境

     點(diǎn)擊運(yùn)行按鈕旁邊的小的黑色三角,點(diǎn)擊Open Run Dialog…

出現(xiàn)如下窗口,雙擊Java Application,Name框里的名字改成:openfire_src3.5.1,點(diǎn)擊Main class右邊的Search按鈕,

 

 

出現(xiàn)如下窗口:

在第一個(gè)文本框里輸入server,在第二個(gè)框里選擇ServerStarter-org.jivesoftware.openfire.starter,點(diǎn)OK

 

點(diǎn)擊eclipse菜單Window->Show View->Ant,如圖:

 

ant窗口里右擊選擇Add Buildfiles…,如下圖所示:

 

出現(xiàn)如下窗口:選擇:openfire_src->build->build.xml,點(diǎn)擊OK按鈕。

 

雙擊在ant窗口里生成的菜單,即開始部署項(xiàng)目。

 

察看console里顯示的信息:如果顯示BUILD SUCCESSFUL就表示項(xiàng)目部署成功。如圖:

  第三章:代碼研究


Openfire socket 網(wǎng)絡(luò)連接包括:

1. 服務(wù)器和服務(wù)器之間的連接(監(jiān)聽在端口 5269

2. 外部組件和服務(wù)器之間的連接(監(jiān)聽在端口 5275

3. 多元 (complex) 連接(監(jiān)聽在端口 5269

4.客戶端和服務(wù)器的連接(監(jiān)聽在端口5222)

5.和客戶端通過(guò)TLS/SSL3.0和服務(wù)器的連接。(監(jiān)聽在端口5223)

這些連接都是通過(guò)ConnectionManager接口實(shí)現(xiàn)管理的,程序中對(duì)ConnectionManager接口的實(shí)現(xiàn)類是 ConnectionManagerImpl,它是作為一個(gè)模塊(Module)類加載到服務(wù)器中的。


下面分析的是客戶端和服務(wù)器的連接。 

ConnectionManagerImpl 中是通過(guò)調(diào)用 startClientListeners 方法來(lái)初始化和開始端口監(jiān)聽的。

Mina框架 

startClientListeners 方法使用的是 Apache Mina 框架來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)連接的, Mina 框架的模式如下:

IoFilter

 IoFilter MINA 的功能擴(kuò)展提供了接口。它攔截所有的 IO 事件進(jìn)行事件的預(yù)處理和后處理。它與 Servlet 中的 filter 機(jī)制十分相似。多個(gè) IoFilter 存放在 IoFilterChain

 IoFilter 能夠?qū)崿F(xiàn)以下功能:數(shù)據(jù)轉(zhuǎn)換,事件日志,性能檢測(cè)

Openfire 中主要用 filter 這種機(jī)制來(lái)進(jìn)行數(shù)據(jù)轉(zhuǎn)換。

Protocol Codec Factory

Protocol Codec Factory 提供了方便的 Protocol 支持,通過(guò)它的 Encoder Decoder ,可以方便的擴(kuò)展并支持各種基于 Socket 的網(wǎng)絡(luò)協(xié)議,比如 HTTP 服務(wù)器、 FTP 服務(wù)器、 Telnet 服務(wù)器等等。

要實(shí)現(xiàn)自己的編碼 / 解碼器 (codec) 只需要實(shí)現(xiàn) interface: ProtocolCodecFactory 即可,在 Openfire 中實(shí)現(xiàn) ProtocolCodecFactory 的類為 XMPPCodecFactory

IoHandler :

MINA 中,所有的業(yè)務(wù)邏輯都有實(shí)現(xiàn)了 IoHandler class 完成      ,當(dāng)事件發(fā)生時(shí),將觸發(fā) IoHandler 中的方法 :

sessionCreated

sessionOpened

sessionClosed

sessionIdle

exceptionCaught

messageReceived

messageSent

Openfire 中客戶端和服務(wù)器連接的 IoHandler 實(shí)現(xiàn)類是 ClientConnectionHandler ,它是從 ConnectionHandler 中繼承來(lái)的。

startClientListeners 方法首先為 Mian 框架設(shè)置線程池,再將一個(gè)由 XMPPCodecFactory 作為 Protocol Codec Factory Filter 放入到 FilterChain 中, 然后綁定到端口 5222 ,并將 ClientConnectionHandler 作為 IoHandler 對(duì)數(shù)據(jù)進(jìn)行處理。完成這些步驟后 Openfire 就在 5222 等待客戶端的連接。

客戶端連接的處理過(guò)程:

 當(dāng)有客戶端進(jìn)行連接時(shí)根據(jù) Mina 框架的模式首先調(diào)用的是 sessionOpened 方法。

sessionOpened 首先為此新連接構(gòu)造了一個(gè) parser XMLLightWeightParser ),這個(gè) parser 是專門給 XMPPDecoder (是 XMPPCodecFactory 的解碼器類) 使用的,再創(chuàng)建一個(gè) Openfire Connection 類實(shí)例 connection 和一個(gè) StanzaHandler 的實(shí)例。最后將以上的 parser, connection StanzaHandler 的實(shí)例存放在 Mina session 中,以便以后使用。

當(dāng)有數(shù)據(jù)發(fā)送過(guò)來(lái)時(shí), Mina 框架會(huì)調(diào)用 messageReceived 方法

messageReceived 首先從 Mina session 中得到在 sessionOpened 方法中創(chuàng)建的 StanzaHandler 實(shí)例 handler ,然后從 parsers 中得到一個(gè) parser (如果 parsers 中沒(méi)有可以創(chuàng)建一個(gè)新的實(shí)例)(注意這個(gè) parser 和在 sessionOpened 方法中創(chuàng)建的 parser 不同,這個(gè) parser 是用來(lái)處理 Stanza 的,而在 sessionOpened 方法中創(chuàng)建的 parser 是在 filter 中用來(lái)解碼的,一句話說(shuō)就是在 sessionOpened 方法中創(chuàng)建的 parser 是更低一層的 parser )。最后將 xml 數(shù)據(jù)包交給 StanzaHander 的實(shí)例 hander 進(jìn)行處理。

StanzaHander的實(shí)例hander處理xml數(shù)據(jù)包的過(guò)程

StanzaHander 首先判斷 xml 數(shù)據(jù)包的類型, . 如果數(shù)據(jù)包以“ <stream:stream ”打頭那么說(shuō)明客戶端剛剛連接,需要初始化通信(符合 XMPP 協(xié)議) Openfire 首先為此客戶端建立一個(gè)與客戶端 JID 相關(guān)的 ClientSession ,而后與客戶端交互協(xié)商例如是否使用 SSL ,是否使用壓縮等問(wèn)題。當(dāng)協(xié)商完成之后進(jìn)入正常通信階段,則可以將 xml 數(shù)據(jù)包交給這個(gè)用戶的 ClientSession 進(jìn)行派送( deliever ),經(jīng)過(guò)派送數(shù)據(jù)包可以發(fā)送給 PacketRouteImpl 模塊進(jìn)行處理。

----------------------------------------------------------------------------------------------------------------------------------------------------

 結(jié)點(diǎn)類包

       起點(diǎn)    org.jivesoftware.openfire.starter.ServerStarter

       服務(wù)器  org.jivesoftware.openfire.XMPPServer

       用戶驗(yàn)證包 里面有AuthProvier接口、幾個(gè)實(shí)現(xiàn)類。。。

               org.jivesoftware.openfire.auth

       用戶   org.jivesoftware.openfire.user

       組     org.jivesoftware.openfire.group

       好友列表org.jivesoftware.openfire.roster

      開發(fā)插件會(huì)用到的接口和包

          org.jivesoftware.openfire.container.Plugins

          org.xmpp.component.Component

          org.jivesoftware.openfire.event
          org.jivesoftware.openfire.handler

      攔截器

          org.jivesoftware.openfire.interceptor