摘 要: 介紹了Microsoft用于構建分布式面向服務架構的新一代框架WCF(Windows Communication Foundation)的體系結構與技術要素;同時分析了對等網(wǎng)絡(Peer-to-Peer network)的基本原理和網(wǎng)格化特性。在分析WCF和P2P網(wǎng)絡優(yōu)點的基礎上開發(fā)了一個即時通信軟件,總結了使用.NET平臺開發(fā)P2P應用的基本步驟,闡述了對等網(wǎng)絡是開發(fā)P2P應用的理想平臺。
關鍵詞: WCF; SOA; 對等網(wǎng)絡; 網(wǎng)格化; 即時通信
對等網(wǎng)絡P2P(Peer to Peer)也稱為對等連接,是一種新的通信模式。P2P網(wǎng)絡的一個重要目標就是讓所有的客戶端都能提供資源,包括帶寬、存儲空間和計算能力。因此,當有節(jié)點加入且對系統(tǒng)請求增多,整個系統(tǒng)的容量也增大。這是目前客戶機/服務器(C/S)結構不能實現(xiàn)的。
P2P的應用開發(fā)是分布式網(wǎng)絡開發(fā)的一種典型應用,軟件開發(fā)難度較大,WCF(Windows Communication Foundation)作為微軟基于SOA所推出的.NET平臺下的新一代框架產(chǎn)品集成了現(xiàn)有技術的優(yōu)點。本文將綜合利用對等網(wǎng)絡和WCF實現(xiàn)一個即時通信軟件,采用WCF快速、便捷地開發(fā)P2P應用。
1 WCF概述
WCF整合了Com+、.Net Remoting、WebService等現(xiàn)有技術的優(yōu)點,提供了一種構建安全可靠的分布式面向服務系統(tǒng)的統(tǒng)一的框架模型,使軟件開發(fā)人員在開發(fā)分布式應用時變得更加輕松[1]。
1.1 面向服務
WCF是一套面向服務的框架。服務是指暴露在外的一系列功能的集合,面向服務則是指一套構建“面向服務程序”的抽象原則以及最優(yōu)方法[2]?;赪CF的程序設計考慮更多的是提供和使用服務。
WCF擁有一個非常靈活的分層體系結構,它的目標是在單個框架中提供編碼、托管、消息傳遞模式、網(wǎng)絡連接、安全性和互操作性,這有助于簡化分布式應用程序的開發(fā)[3]。
1.2 WCF的編程模型
WCF服務是通過端點通信的。WCF服務的端點充當與其他應用程序通信的網(wǎng)關。它是發(fā)送或接收消息的位置,包含交換消息所需的所有信息。端點由地址、綁定以及契約三部分組成[4],如圖1所示。
地址制定該服務所駐留的位置,它表示為URL形式。綁定描述了WCF服務如何與客戶端應用程序通信。契約是對WCF服務所提供功能的聲明。契約公開服務的接口、類、方法和變量,以使客戶端應用程序能夠訪問和使用它們。
2 P2P對等網(wǎng)絡
在P2P對等網(wǎng)絡中,將由對等節(jié)點組成的集合稱為網(wǎng)格(mesh)。任何一個對等節(jié)點都可以通過指定終節(jié)點(Endpoint)的方法來加入到一個網(wǎng)格中。網(wǎng)格是彼此之間可以相互通信并由唯一的網(wǎng)格ID標識的對等節(jié)點的命名集合。網(wǎng)格中的活動節(jié)點發(fā)布其網(wǎng)格名稱,以便其他節(jié)點可以找到它們。
解析程序服務可以獲取網(wǎng)格ID,然后返回與向該特定網(wǎng)格ID注冊的節(jié)點對應的地址列表。解析程序保持已注冊地址的列表,此列表是它通過讓網(wǎng)格中的每個節(jié)點向該服務注冊而創(chuàng)建的。
對等解析程序(PNRP)負責將網(wǎng)格ID解析為網(wǎng)格中節(jié)點的終節(jié)點地址[5]。在打開一個對等節(jié)點后,它會使用對等解析程序?qū)⒕W(wǎng)格ID解析為網(wǎng)格中其他對等節(jié)點的地址列表。這會創(chuàng)建一個由互連節(jié)點組成的網(wǎng)格,從而允許通過網(wǎng)格傳播消息。
3系統(tǒng)的設計與實現(xiàn)
3.1系統(tǒng)總體設計
P2P應用程序的設計與普通分布式應用程序不同,在設計時必須考慮到應用程序本身既是服務的提供方同時也是服務的調(diào)用方。軟件整體結構如圖2所示[6]。
每個加入到P2P對等網(wǎng)絡節(jié)點的客戶端可以通過EndPoint來加載WCF的服務契約并發(fā)布出去,但是整個對等網(wǎng)絡中沒有中央服務器的存在,所以節(jié)點與節(jié)點之間相互發(fā)現(xiàn)和通信比較困難,P2P對等網(wǎng)絡通過稱為PNRP的名稱解析的服務來解決這樣的問題。
3.2 服務端程序的設計
服務端主要的功能是創(chuàng)建一個CustomPeerResolverService類型的ServiceHost代理,啟用對等解析程序(PNRP),還負責提供服務主機的基址,該基址在配置文件(App.config)中進行配置。經(jīng)過配置之后,服務便可以由客戶端的計算機在該基址訪問。具體代碼如下:
using System.ServiceModel.PeerResolvers;
//添加對等名稱解析協(xié)議服務
……
CustomPeerResolverService cprs;
//聲明自定義對等解析程序服務的變量
ServiceHost host; //聲明服務代理類
……
cprs=new CustomPeerResolverService(); //初始化變量
host=new ServiceHost(cprs);
在配置文件(App.config)定義一個終節(jié)點,使客戶端可以與服務進行通信。使用NetTcpBinding進行綁定。
App.config配置如下:
<endpoint address="net.tcp://localhost/P2PChatServer" binding="netTcpBinding"… ></endpoint>
經(jīng)過配置之后,服務便可以由客戶端在 net.tcp://localhost/P2PChatServer處訪問。
3.3 客戶端加入網(wǎng)格
要實現(xiàn)P2P對等網(wǎng)絡中的節(jié)點相互通信,首先需要創(chuàng)建和注冊同級,其他同級需要查找和訪問已注冊的同級。
需要特別注意的是網(wǎng)格中的每臺計算機既可以作為客戶端又可以作為服務器,那么設計所要實現(xiàn)的契約時,應將契約的回調(diào)契約指定為其自身。這樣無論是調(diào)用方還是被調(diào)用方都能夠?qū)崿F(xiàn)相同的操作,使得每臺計算機既能充當客戶端又能成為服務端[6]。創(chuàng)建契約的代碼如下:
[ServiceContract(CallbackContract=typeof(IChatService))]
//將回調(diào)契約定義為本身
public interface IChatService
{
[OperationContract(IsOneWay=true)]
void DoSomeWork; //實現(xiàn)相應的功能
}
使用WCF中的DuplexChannelFactory<T>泛型類創(chuàng)建一個雙向通道來實現(xiàn)雙向調(diào)用。使用該通道的CreateChannel()方法來創(chuàng)建通信通道的一個實例。整個對等名稱解析過程是由netPeerTcpBinding綁定封裝的,在創(chuàng)建通道的同時,會在網(wǎng)格中注冊節(jié)點,使得節(jié)點加入網(wǎng)格[6]。代碼如下:
InstanceContext context=new InstanceContext(this);
//上下文實例
Factory=new DuplexChannelFactory<IChatChannel>(context,"ChatEndPoint");
//創(chuàng)建雙工通信
Channel =Factory.CreateChannel(); //創(chuàng)建通道
3.4 網(wǎng)格中的計算機獲取節(jié)點標識
當網(wǎng)格內(nèi)有新的節(jié)點加入或退出時必須發(fā)送一個消息,這樣新的節(jié)點能查找到網(wǎng)格內(nèi)其他的節(jié)點。只有網(wǎng)格內(nèi)所有的節(jié)點有一個唯一的標識,才能實現(xiàn)對特定節(jié)點服務的調(diào)用,實現(xiàn)網(wǎng)格中客戶端點對點的相互通信。因此在編寫客戶端服務契約時必須包含獲取網(wǎng)格節(jié)點的方法以及提供節(jié)點加入或退出網(wǎng)格的事件處理代碼。
通過DuplexChannelFactory<T>創(chuàng)建的雙向通信能夠調(diào)用客戶端服務契約的方法,當有新的節(jié)點加入網(wǎng)格時通過調(diào)用通道實例中的Join()方法將節(jié)點的標識傳遞給網(wǎng)格內(nèi)其他節(jié)點。
由于在服務端App.config文件中定義了統(tǒng)一的基地址,所以對通道方法的調(diào)用是對網(wǎng)格內(nèi)所有節(jié)點的調(diào)用,因此網(wǎng)格內(nèi)其他節(jié)點就可以發(fā)現(xiàn)新加入的節(jié)點。具體實現(xiàn)的方法如下:
delegate void UserJoined(stringname);//聲明加入網(wǎng)格代理
static event UserJoined NewJoin; //定義加入網(wǎng)格事件
public void Join(stringmemberName)
{
if(NewJoin!=null)
{
NewJoin(memberName);
}
}
…
Channel.Join(this.userName)
當有節(jié)點退出網(wǎng)格時,與加入網(wǎng)格時一樣聲明一個退出網(wǎng)格事件代理,然后調(diào)用通道實例中的Leave()方法,退出網(wǎng)格;具體實現(xiàn)代碼與加入網(wǎng)格相似。
網(wǎng)格中節(jié)點之間消息的傳遞也可以聲明一個消息發(fā)送事件代理,在發(fā)送時可以加入自身的標識作為參數(shù),以便其他人能夠識別。
4 系統(tǒng)的測試與運行
系統(tǒng)的開發(fā)工具選擇Visual Studio 2010,程序編譯通過后,首先打開即時通信服務端軟件,然后單擊開始,服務啟動成功,如圖3所示。
在兩臺客戶端計算機上分別運行即時通信客戶端軟件并且輸入用戶名,點擊Join按鈕后節(jié)點會在網(wǎng)格中注冊并獲取網(wǎng)格中其他節(jié)點的標識,此時兩臺計算機作為兩個節(jié)點成功加入到網(wǎng)格中。在圖4中,一臺計算機成功地接收到了另一臺計算機自身登錄名稱和它所發(fā)送的消息。
本文介紹了如何使用WCF來開發(fā)P2P應用程序。P2P應用程序開發(fā)成本低并且擁有較好的并發(fā)處理能力,適用于小規(guī)模的網(wǎng)絡,維護容易;但是對等網(wǎng)絡同時也存在一些不足和缺點,如資源分享紊亂、管理較難、安全性較低等問題。雖然還存在著一些問題和不足,但P2P對等網(wǎng)絡依然是開發(fā)點對點應用的一個理想平臺。
參考文獻
[1] 閆冰.基于WCF的分布式應用開發(fā)[J].電腦知識與技術,2008,3(1):68-70.
[2] 孫耀.基于WCF的網(wǎng)格化信息管理系統(tǒng)的研究與實現(xiàn)[D]. 長春:東北師范大學,2009.
[3] 程湯培. 基于WCF的即時通信軟件的設計與實現(xiàn)[J]. 電腦編程技巧與維護,2008(4):24-40.
[4] 陳茹. WCF框架下分布式系統(tǒng)的集成技術研究[D].大連:大連海事大學,2010.
[5] 羅小平.基于PNRP協(xié)議的PeerChannel共享存儲模型的研究與應用[D].成都:西南石油大學,2011.
[6] 王麗麗,戴迪,王成江.Windows對等網(wǎng)絡上P2P應用程序的設計與實現(xiàn)[J].計算機與信息技術,2009(3):36-40.