NO IMAGE



Normal
0
false

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE



開源
IM
工具編譯與環境搭建攻略

因為工作的緣故,需要考察一下目前比較流行的開源
IM
客戶端與伺服器。由於本人是搞
C
的,並且需要
IM
平臺與現有的一款產品能夠實現互聯互通,所以將
IM
平臺開發語言基本鎖定在
C
或者
C#
,經過考察後發現一款優秀的
C#
語言開發的
IM
開源平臺
agsXMPP

。並且採用了一款非常優秀的
JAVA
語言開發的
IM
客戶端
spark

作為測試參考,伺服器則採用了
openfire

這篇文章並不完全是我的原創,為了能夠順利的實現利用
agsXMPP
開源平臺製作的客戶端能夠通過
openfire
伺服器與另外一個客戶端
spark
進行互聯互通以及相互傳送檔案,我參考了
openfire
的網站相關內容,也在網上參考了其它一些解決方案,不過我將在整個過程中遇到的問題進行了一些總結和歸納,希望後來的同學們能夠從這篇文章中得到幫助。

一、

搭建環境所需要的原始碼工程及其
SVN
地址

1.    

agsXMPP

SVN
地址是:

svn://svn.ag-software.de/agsxmpp/trunk

2.    

openfire

SVN
地址是:

http://svn.igniterealtime.org/svn/repos/openfire/trunk

3.    

spark

SVN
地址是:

http://svn.igniterealtime.org/svn/repos/spark/tags/spark_2_5_8

二、

編譯
agsXMPP

編譯
agsXMPP
很簡單,只需要用
Visual Studio .NET 2008
開啟相關工程檔案並且編譯即可,一般情況下不會出現什麼錯誤。

但是由於客戶端採用的是
agsXMPP
自帶的例項
miniclient
,伺服器端採用的是
openfire
,所以我們在編譯原始碼的時候需要考慮到這兩者之間的連通性,經過實際的驗證發現,必須對
miniclient
中的相關原始碼進行修改後方能順利通訊。

1.   

認證協議問題

agsXMPP
在認證的時候,預設使用
DIGEST-MD5
,但是在
openfire
下無法認證通過,改成
PLAIN
即可,也就是在
miniclient

frmMain.cs

XmppCon_OnSaslStart
方法中,將如下兩行的註釋去掉:

args.Auto = false;

args.Mechanism = agsXMPP.protocol.sasl.Mechanism.GetMechanismName(agsXMPP.protocol.sasl.MechanismType.PLAIN);

2.   

Iq

Openfire
不支援
Iq
節帶

to
的屬性,所以在
agsXMPP
中傳送
Iq
節的時候先
RemoveAttribute("to")
一下就行了,具體的就是找到
agsXMPP
原始碼目錄下的
sasl/saslHandler.cs
檔案中,所有呼叫
SendIq
方法的前面,都加入如下語句:

bIq.RemoveAttribute("to");

 

好了經過修改後重新編譯,我們就可以順利的與
openfire
伺服器進行身份認證並可以傳送訊息了。

 

三、

編譯
spark

編譯
spark
也很簡單,
spark

openfire
的官方網站上提供了
SVN
下載,編譯以及搭建除錯環境的方法,我也順便抄錄到這裡。

1.   

安裝
JDK

這個不用說了,注意版本,最少要
1.5
,推薦使用最新的
1.6
版本

2.   

安裝
Eclipse3.3

a)        

從官網下載
Eclipse
3.3 (

Java
開發者用的
)

b)        

假設你把
eclipse
安裝在
c:/program files/eclipse,
進入這個資料夾,為
eclipse.exe
創造一個桌面圖示,右擊這個圖示,選擇

屬性

,開啟屬性對話方塊,在

目標

的輸入框裡,輸入如下

"C:/Program
Files/Eclipse/eclipse.exe" -vm "C:/Program
Files/Java/jdk1.6.0/bin/javaw"

熟悉
eclipse
的都知道這是為
eclipse
指定使用哪個
Java
VM

3.   


eclipse
安裝
Subversive
外掛

a)        

用上面建的圖示開啟
eclipse
,下面開始安裝
Subversive
外掛,由於我用的是英文版的
ecplipse

下面的選單我都用英文。

b)        

點選
Help::Software
Updates::Find and Install…

c)        

點選

Search for new features to install
,點

Next

d)        


New
Remote Site…
按鈕

e)        


name
的輸入框裡輸入
Subversive
,並且在
URL
輸入框裡輸入

http://www.polarion.org/projects/subversive/download/1.1/update-site
           
(最新的
Subversive
地址上

http://www.eclipse.org/subversive
查詢)

f)         

點選
Finish

,開始安裝
Subversive

eclipse
將搜尋網站,並且在下一個視窗中顯示你想安裝的功能

選擇安裝
Subversive SVN Team Provider Plugin

Subversive Client Libraries
下面所有的功能

g)        


Next

eclipse
開始安裝過程,安裝結束後重啟
eclipse

4.   

利用
svn
方式下載
spark
程式碼

a)        

點選如下
Windows::Open
Perspective::Other…

b)        

彈出一個
“Open
Perspective”
對話方塊,選擇
“SVN
Repository Exploring”
,單擊
OK

c)        

這是
eclipse
介面發生變化,在左邊的
“ SVN Repositories”
面板上,右擊滑鼠選擇
New::Repository Location…

d)        


“New
Repository Location”
的位置輸入上面提供的
SVN
地址,單擊
“Finish”

e)        

SVN Repositories
面板上,會發生變化,展開它,找到
spark
的選項,右擊
spark
下面的
trunk
項,選擇
“Check Out”
,下載
spark
的程式碼。

f)         

下載完成後,選擇
Window::Open
Perspective::Java
,在
Project
Explorer
面板上,
 

看到
Spark
專案,刪掉它,在彈出來的對話方塊中選擇
“Do not delete contents” 

在工作目錄下面找到
spark
資料夾,裡面就是
spark
的原始碼。其實我們可以通過打包下載原始碼的方式來獲得原始碼,但那樣我們就無法及時跟蹤

spark
最新的原始碼升級,同時有了版本管理,還可以在修改
spark
的過程中,方便的比較與原版的差異,所以還是強烈建議大家採用
SVN
方式下載。

5.   

建立
Spark
專案

a)        

點選
Window::Open
Perspective::Java
選單

b)        


Project
Explorer
視窗中
,
如果有
spark
這個專案
,
把它刪了
,
刪除時
,
會問你要不要刪除檔案
,
選擇不要
.

c)        

選擇
File::New::Project…,
再選擇
Java::Java Project,

New Java Project
視窗選擇

"Create project from existiing source",
然後把
spark
檔案所在的資料夾加進去
.

d)        


"project
name"
中輸入
spark,
要和資料夾的名字相同
.

e)        


Finish.

6.   

生成
Spark

a)        

點選
Window::Show
View::Ant

b)        

右擊
Ant
面板
,
選擇
Add
Buildfiles

c)        

展開
spark::build
資料夾
,
選擇
build.xml,
點選
"OK"

d)        


Ant
面板
,
展開
Spark,
雙擊
"release",
等一段時間
,
會提示
"Build Successful".

7.   

Create
Project Builder

a)        

點選
Run::Open
Debug Dialog…,
出現
"Run"
視窗

b)        

選擇
"Java
Application",
點選
"New"
按鈕
.

c)        


"Main"
標籤頁
,

New_configuration
換成
Spark
或其它的這個無所謂
.

d)        

點選
Project::Browse
按鈕
,
選擇
Spark,
再點
OK.

e)        

點選
Main
class::Search
按鈕
,
選擇
main
所在的類
Startup-org.jivesoftware.launcher,

再點選
OK

f)         

建議勾選
Stop
in main.

g)        

點選
Classpath
標籤頁
,
選擇
User
Entries ,
使得
Advanced..
按鈕變的可用
.

h)        

點選
Advanced
按鈕
.
在彈出來的
Advanced
Options
視窗
,
選擇
Add
Folders,
再點
OK,

Folder Selection
視窗選擇
spark::src::resources

資料夾
,
點選
OK

i)         

選擇
Common
標籤頁
,
勾選
Debug,Run
前面的框

j)         

點選
Apply,
再點選
Close

8.   

Run/Debug

點選
Run::Open Run Dialog..,
在彈出的對話方塊選擇
Spark,
然後點
Run
就行了
.

9.   

特別需要注意的是,我在實際的編譯當中發現,
GSSAPIConfiguration.java
檔案被放到了
src/java
目錄下,導致
ant
編譯失敗,報告找不到
GSSAPIConfiguration
類錯誤,其實這個原始碼應該被移動到(是移動而不是拷貝)
src/java/org/jivesoftware
目錄下,這樣就可以順利編譯了。

四、

編譯
openfire

1.   

Install JDK

這個不用說了,注意版本,最少要
1.5
,推薦使用最新的
1.6
版本
.

2.   

安裝
Eclipse3.3

a)        

從官網下載
Eclipse
3.3 (

Java
開發者用的
)

b)        

假設你把
eclipse
安裝在
c:/program files/eclipse,
進入這個資料夾,為
eclipse.exe
創造一個桌面圖示,右擊這個圖示,選擇

屬性

,開啟屬性對話方塊,在

目標

的輸入框裡,輸入如下

"C:/Program
Files/Eclipse/eclipse.exe" -vm "C:/Program
Files/Java/jdk1.6.0/bin/javaw"

熟悉
eclipse
的都知道這是為
eclipse
指定使用哪個
Java
VM

3.   


eclipse
安裝
Subversive
外掛

a)        

用上面建的圖示開啟
eclipse
,下面開始安裝
Subversive
外掛,由於我用的是英文版的
ecplipse

下面的選單我都用英文。

b)        

點選
Help::Software
Updates::Find and Install…

c)        

點選

Search for new features to install
,點

Next

d)        


New
Remote Site…
按鈕

e)        


name
的輸入框裡輸入
Subversive
,並且在
URL
輸入框裡輸入

http://www.polarion.org/projects/subversive/download/1.1/update-site
           
(最新的
Subversive
地址上

http://www.eclipse.org/subversive
查詢)

f)         

點選
Finish

,開始安裝
Subversive

eclipse
將搜尋網站,並且在下一個視窗中顯示你想安裝的功能

選擇安裝
Subversive SVN Team Provider Plugin

Subversive Client Libraries
下面所有的功能


Next

eclipse
開始安裝過程,安裝結束後重啟
eclipse

4.   

利用
svn
方式下載
Openfire
程式碼

g)        

點選如下
Windows::Open
Perspective::Other…

h)        

彈出一個
“Open
Perspective”
對話方塊,選擇
“SVN
Repository Exploring”
,單擊
OK

i)         

這是
eclipse
介面發生變化,在左邊的
“ SVN Repositories”
面板上,右擊滑鼠選擇
New::Repository Location…

j)         


“New
Repository Location”
的位置輸入
http://svn.igniterealtime.org/svn/repos

,單擊
“Finish”

k)        

SVN Repositories
面板上,會發生變化,展開它,找到
openfire
的選項,右擊
openfire

下面的
trunk
項,選擇
“Check
Out”
,下載
openfire
的程式碼。

下載完成後,選擇
Window::Open
Perspective::Java
,在
Project
Explorer
面板上,
 

看到
openfire
專案,刪掉它,在彈出來的對話方塊中選擇
“Do
not delete contents” 

在工作目錄下面找到
openfire
資料夾,裡面就是
openfire
的原始碼。

5.   

建立
Openfire
專案

f)         

點選
Window::Open
Perspective::Java
選單

g)        


Project
Explorer
視窗中
,
如果有
Openfire
這個專案
,
把它刪了
,
刪除時
,
會問你要不要刪除檔案
,
選擇不要
.

h)        

選擇
File::New::Project…,
再選擇
Java::Java Project,

New Java Project
視窗選擇

"Create project from existing source",
然後把
Openfire
檔案所在的資料夾加進去
.

i)         


"project
name"
中輸入
Openfire,
要和資料夾的名字相同
.

j)         

如果“
Open Associated Perspective
”視窗開啟,選擇“
Yes
”;

k)        


Finish.

6.   

生成
Openfire

e)        

點選
Window::Show
View::Ant

f)         

右擊
Ant
面板
,
選擇
Add
Buildfiles

g)        

展開
openfire::build
資料夾
,
選擇
build.xml,
點選
"OK"

h)        


Ant
面板
,
展開
Openfire XMPP Server
,
雙擊
"


openfire

",
等一段時間
,
會提示
"Build Successful".

7.   

Create Project Builder

k)        

點選
Run::Open
Debug Dialog…,
出現
"Run"
視窗

l)         

選擇
"Java
Application",
點選
"New"
按鈕
.

m)      


"Main"
標籤頁
,

New_configuration
換成
Openfire
或其它的這個無所謂
.

n)        

點選
Project::Browse
按鈕
,
選擇
openfire
,
再點
OK.

o)        

點選
Main
class::Search
按鈕
,
選擇
main
所在的類
ServerStarter – org.jivesoftware.openfire.starter
,

再點選
OK

p)        

建議勾選
Stop
in main.

q)        

點選
Arguments
標籤頁,在
VM
引數框中輸入
-DopenfireHome="${workspace_loc:openfire}/target/openfire"

r)         

點選
Classpath
標籤頁
,
選擇
User
Entries ,
使得
Advanced..
按鈕變的可用
.

s)        

點選
Advanced
按鈕
.
在彈出來的
Advanced
Options
視窗
,
選擇
Add
Folders,
再點
OK,

Folder Selection
視窗選擇
openfire::src::i18n
資料夾
,
點選
OK

t)         

再次點選
Advanced->Advanced
Options-> Add Folders->Folder Selection
視窗選擇
openfire::src::resources::jar
資料夾
,
點選
OK

u)        

再次點選
Advanced->Advanced
Options-> Add Folders->Folder Selection
視窗選擇
openfire::build::lib::dist
資料夾
,
點選
OK

v)        

選擇
Common
標籤頁
,
勾選
Debug,Run
前面的框

w)       

點選
Apply,
再點選
Close

8.   

Run/Debug

點選
Run::


Run History::Openfire
以及
Run::Debug History::Openfire
,然後點
Run/Debug
就行了。

五、

編譯過程中遇到的問題及解決方案

1.   

解決
openfire
在使用
MySQL
資料庫後的中文亂碼問題

首先要保證你為
openfire
建立的資料庫編碼是
utf8
的,建表語句如下:

create
database openfire default character set utf8 default collate utf8_general_ci;

當你原來就建立好資料庫時,你可以用:

alter
database openfire default character set utf8 default collate utf8_general_ci;

其次,在初始化
openfire
資料庫,即第一次配置
openfire
伺服器時,在連線資料庫那裡的連線串要加入字元編碼格式,必須在連線裡增加
UTF8
的編碼要求,連線字串設定如下:

jdbc:mysql://127.0.0.1:3306/openfire?useUnicode=true&characterEncoding=utf8

如果已經安裝完成,這個配置也是可以改動的,直接到
openfire
的安裝目錄下,找到
conf/openfire.xml
這樣一個檔案,開啟找到如下的
XML
節,修改其中的
serverURL
即可

<database>

<defaultProvider>

<driver>com.mysql.jdbc.Driver</driver>

<serverURL>jdbc:mysql://127.0.0.1:3306/openfire?useUnicode=true&amp;characterEncoding=utf8</serverURL>

2.   

agsXMPP

openfire
之間實現檔案傳輸問題

agsXMPP
的例項
miniclient
提供了兩種客戶端

客戶端的檔案傳輸機制,一種是
P2P
的直接傳輸技術,也就是傳輸的接收方開啟一個偵聽埠(本例為
1000
),傳送方直接與接收方的偵聽埠建立
socket
連線,這種方式的好處是,
1
)建立
P2P
的直接通訊,可以最大化利用網路頻寬,檔案傳送效率最高,
2
)降低了對中轉伺服器的壓力,
3
)軟體架構比較簡單容易實現。不過這種方式也存在很多問題,
1
)傳送和接收方必須在同一個子網當中,要能夠相互定址到,
2
)如果傳送或者接收方分別處於
NAT
網路或者防火牆的後面,那麼這種連線將無法建立,
3
)在接收方需要開啟偵聽埠,可能導致本機防火牆或者防毒軟體的禁止。

另外一種是通過
file
transfer proxy
機制在兩個相互無法連通的主機之間的檔案傳輸機制。由於兩個客戶端都可以連線
openfire
伺服器(可能的情況是,
1
)客戶端
A
和客戶端
B
都連線在伺服器
B1
上,
2
)客戶端
A
連線伺服器
S1
,客戶端
B
連線另外一個伺服器
B2
),無論哪種情況,客戶端
A

B
都應該可以連線到一個代理伺服器上(也可能這個代理伺服器就在
B1
或者
B2
上),因此我們完全可以在
A

B
之間建立一個檔案傳輸代理,傳送方
A
將檔案傳送到代理伺服器上,而
B
則從代理伺服器讀取檔案。

檔案傳輸代理一般可以採用
bytestream

SOCKS5
代理)或者
proxy65
代理技術。目前有很多開源的
SOCKS5
代理和
proxy65
代理伺服器可用,不過
openfire
內建了一個
SOCKS5
代理伺服器,我們完全可以利用它來完成檔案代理傳輸任務。

如果要用
openfire
做檔案傳輸代理,需要做如下配置:

1)    


openfire
配置域名

使用

openfire
需要配置機器的域名。如果區域網內沒有安裝域伺服器,則需要手工為機器配置域名,開啟

C:/WINDOWS/system32/drivers/etc/hosts
檔案,增加一新行:

127.0.0.1                         im.openfire.com 

(使用者根據自己的需要可配置稱別的名字,但最好符合帶

.
的域名格式)

127.0.0.1                        
proxy.im.openfire.com

其他機器使用域名訪問

openfire,
也需要在

C:/WINDOWS/system32/drivers/etc/hosts
中指定

bzwang.tzsoft.com
對應的
ip
地址,假設安裝
openfire
的主機

IP

192.168.1.10,

hosts
檔案中應增加一新行

:

192.168.1.10                   
im.openfire.com

通過這種方式指定主機域名,建議安裝

openfire
的機器配置靜態
ip
地址以免
ip
發生改變。

2)    

配置
openfire
檔案代理

配置好
openfire
的域名後,可以通過
http
訪問其管理介面,在瀏覽器中輸入:
http://im.openfire.com:9090

即可登陸管理介面。


openfire
的管理介面中,選擇
“System Properties
(系統屬性)

,將屬性
xmpp.domain
值改為
im.openfire.com
,另外新增一個屬性
xmpp.proxy.transfer.required
,將其值設定為
false

點選
“Server
Settings
(伺服器設定)

標籤頁,點選

File Transfer Settings

(檔案傳輸設定)

,將其屬性設定為
“Enable”
,對應的埠設定為
“7777”.

如果要在不同的傳輸代理伺服器之間傳輸檔案,還需要在
“Server
Settings
(伺服器設定)

標籤頁中,點選
“Server to Server
(伺服器到伺服器)

,將屬性設定為
“Enable”
並將偵聽埠設定為
“5269”

重啟
openfire
伺服器。

3)    

修改
miniclient
原始碼,設定傳輸代理伺服器

Miniclient
原始碼中負責檔案傳輸的原始碼檔案是
frmFileTransfer.cs
,在檔案的開頭有一個常量字串定義了所用到的傳輸代理名稱如下:

const

string
PROXY
= "proxy.im.openfire.com"
;

注意一定要將
PROXY
指向
proxy.im.openfire.com
,因為
XMPP

service discovery
規定了檔案傳輸代理的域名規則,前面一定要加
“proxy”
,否則無法解析。另外也不能直接用傳輸代理的
IP
地址,我浪費了很多時間才找到這個問題的。

另外,再檢查一下
frmFileTransfer.cs
中的
SendStreamHosts
方法,找到如下幾行:

string

hostname
= System
.Net
.Dns
.GetHostName
();

System

.Net
.IPHostEntry
iphe
= System
.Net
.Dns
.Resolve
(hostname
);

   
for
(int
i
= 0; i
< iphe
.AddressList
.Length
;
i
)

   
{

   
          
Console
.WriteLine
("IP address: {0}"
, iphe
.AddressList
[i
].ToString
());

       
 
//bsIq.Query.AddStreamHost(m_XmppCon.MyJID,
iphe.AddressList[i].ToString(),
1000
);

}

bsIq
.Query
.AddStreamHost
(new
Jid
(PROXY
), PROXY
, 7777
);

這幾句的意思是,首先將本機地址列表加入流主機列表中,並在
1000
埠進行偵聽,同時將代理伺服器加入流主機列表,並在
7777
埠偵聽,如果將註釋取消,那麼客戶端之間的檔案傳輸將優先使用
P2P
模式,如果無法連通才使用代理模式,由於我們這裡主要演示的如何使用代理,因此將
P2P
的程式碼註釋掉了,實際的使用過程中,可以將其開啟。

通過上述設定,我們可以實現兩個
miniclient
之間,
miniclient

spark
客戶端之間的檔案收發,而且在內網的環境當中,無論是
P2P
模式還是代理模式,傳送大檔案時效率都是很高的。

六、

我採用
agsXMPP
開發的一款商用的
IM
客戶端

在學習的過程中,我基本瞭解了
agsXMPP
的工作原理,並且利用該平臺花了三個月的時間,製作了一款目前基本可以用在我產品當中的
IM
客戶端,下面就是該軟體的一些截圖,已經能夠實現單人聊天,群組聊天,
P2P
傳送檔案以及伺服器中轉傳送檔案等基本功能,後面有空的話還會考慮加入語音聊天等功能。


1

主介面



2

單人聊天模式


3

多人群組聊天模式


4
檢視歷史記錄

 


5
傳送檔案


6
系統設定

由於這個專案目前只有我一個在做,包括美工在內的相應配置都沒有,所以感覺介面還是很粗糙,希望以後能夠將這個專案繼續做下去,能夠做成一個不錯的東西。