亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        利用Vista和WCF開發(fā)P2P軟件

        2007-01-01 00:00:00陳業(yè)綱徐則同
        計(jì)算機(jī)時(shí)代 2007年5期

        摘要:利用Windows Vista的增強(qiáng)功能并結(jié)合PNRP(對(duì)等名稱解析協(xié)議)、PNM(People Near Me)和WCF(WindowsCommunication Foundation)中引進(jìn)的PeerChannel功能,解決了傳統(tǒng)的P2P應(yīng)用程序開發(fā)中的常見問題。

        關(guān)鍵詞:對(duì)等名稱解析協(xié)議;PNM;WCF;PeerChannel

        0引言

        從傳統(tǒng)意義來說,P2P應(yīng)用程序開發(fā)所面臨的難題包括:需要開發(fā)用于消息交換的專用協(xié)議;必須查找并連接隱藏在“網(wǎng)絡(luò)地址轉(zhuǎn)換”(NAT)或防火墻背后的應(yīng)用程序?qū)嵗?;需要支持在廣域網(wǎng)(WAN)中定位各應(yīng)用程序所需的慣常基礎(chǔ)結(jié)構(gòu)。這些問題將隨著Windows Vista和.NET Framework的發(fā)布而得到解決。將Windows Vista的增強(qiáng)功能與PNRP、PNM和WCF中引進(jìn)的PeerChannel功能相結(jié)合,就能順利開發(fā)P2P應(yīng)用程序。

        1 P2P基本原理:網(wǎng)格計(jì)算

        網(wǎng)格計(jì)算是利用互聯(lián)網(wǎng)技術(shù),把分散在不同地理位置的計(jì)算機(jī)組成一臺(tái)虛擬超級(jí)計(jì)算機(jī),其中每臺(tái)計(jì)算機(jī)是一個(gè)“節(jié)點(diǎn)”,所有計(jì)算機(jī)就組成了節(jié)點(diǎn)網(wǎng)——網(wǎng)格。節(jié)點(diǎn)加入網(wǎng)格的方式取決于所使用的網(wǎng)格技術(shù),通常,該節(jié)點(diǎn)必須用網(wǎng)格名來解析網(wǎng)格中已有的一個(gè)或多個(gè)節(jié)點(diǎn)的物理地址。在接收到網(wǎng)格中一個(gè)或多個(gè)節(jié)點(diǎn)的物理地址后,預(yù)期節(jié)點(diǎn)必須立即連接到這些地址中的一個(gè)、部分或全部地址,并應(yīng)該準(zhǔn)備好響應(yīng)后續(xù)的其他預(yù)期節(jié)點(diǎn)的網(wǎng)格名解析請(qǐng)求。網(wǎng)格名解析是一個(gè)復(fù)雜的問題。這是因?yàn)?,在許多情況下,網(wǎng)格名解析要依賴于一個(gè)或更多的其他網(wǎng)格。

        節(jié)點(diǎn)連接到網(wǎng)格,它就可以通過以下兩種方式之一與其他節(jié)點(diǎn)進(jìn)行通信:網(wǎng)格擴(kuò)散(也稱多方消息傳送),或定向消息傳送。網(wǎng)格很少處于靜態(tài)。在多數(shù)P2P應(yīng)用程序中,由于網(wǎng)絡(luò)連接變動(dòng),或者是用戶啟動(dòng)和終止應(yīng)用程序,節(jié)點(diǎn)可能會(huì)頻繁地加入和離開網(wǎng)格。多數(shù)網(wǎng)格都具備一些維護(hù)機(jī)制。通常而言,網(wǎng)格維護(hù)的目標(biāo)就是修復(fù)或調(diào)整網(wǎng)格以使其更高效或更穩(wěn)健地運(yùn)行;各種網(wǎng)格技術(shù)實(shí)現(xiàn)網(wǎng)格維護(hù)的方式都不同。

        2 PNRP(對(duì)等名稱解析協(xié)議)

        PNRP完成網(wǎng)格名向物理地址的轉(zhuǎn)變。PNRP v1可供Windows XP(SPl)以上版本使用??梢哉f,PNRP本身就是一個(gè)采用Windows服務(wù)形式的P2P應(yīng)用程序,并且PNRP節(jié)點(diǎn)的網(wǎng)格專用于發(fā)現(xiàn)加入到其他網(wǎng)格中的節(jié)點(diǎn)的物理地址。

        PNRP和1Pv6 PNRP構(gòu)建于Internet協(xié)議版本IPv6之上。PNRP功能的原型、結(jié)構(gòu)、錯(cuò)誤代碼均在Windows SDK的p2p.h頭文件中定義。如果某應(yīng)用程序想要向PNRP注冊(cè)—個(gè)網(wǎng)格名,它必須用非托管代碼通過Windows API實(shí)現(xiàn),或用托管代碼通過公共語言運(yùn)行庫(cLR)的P/Invoke工具實(shí)現(xiàn)。目前,在Windows API的PNRP部分的.NET Framework中未包含托管包裝。但通過使用netsh命令行實(shí)用程序能訪問PRNP。命令向PNRP注冊(cè)—個(gè)新的PNRP名可以使用以下命令:

        c:\emp>netsh

        netsh>p2p pnrp peer

        netsh p2p pnrp peer>add 0.baogxm

        Ok.

        0.baogxm即是P2P名。當(dāng)此命令執(zhí)行時(shí),PNRP會(huì)生成--5\"-PNRP ID,將該P(yáng)NRP ID與P2P名相關(guān)聯(lián),并為該P(yáng)NRP ID分配—個(gè)IPv6和IPv4地址。如果訪問另一臺(tái)已安裝PNRP并已啟動(dòng)的計(jì)算機(jī),則可以用以下netsh命令解析網(wǎng)格名0.baogxm:

        netsh p2p pnrp peer>resolve 0.baogxm

        Resolve started...

        Found:Comment:gonzo//Comment字段代表注冊(cè)了0.baogxm的計(jì)算機(jī)名稱,該字段從netsh自動(dòng)填充,并且不能用作解析進(jìn)程的一部分

        Addresses:[0000:0000:0000:0000:0000:0000:0000:0001]:8350 udp

        210.41.35.1 99:8350 tcp

        3 PeerChannel

        WCF為許多不同類型的分布式應(yīng)用程序提供了一個(gè)通用的編程模型。使用這個(gè)通用編程模型可以構(gòu)建P2P應(yīng)用程序。實(shí)際上,PeerChannel WCF模塊專用于構(gòu)建P2P應(yīng)用程序。

        PeerChannel網(wǎng)格專為消息擴(kuò)散而設(shè)計(jì)。PeerChannel網(wǎng)格的結(jié)構(gòu)由每個(gè)節(jié)點(diǎn)所連接的鄰居數(shù)量所控制,PeerChannel網(wǎng)格會(huì)主動(dòng)維護(hù)網(wǎng)格的結(jié)構(gòu)。更具體點(diǎn)說,網(wǎng)格中的節(jié)點(diǎn)會(huì)將連接的鄰居數(shù)保持在2~7個(gè)之間,以使本地節(jié)點(diǎn)的資源需求與保持網(wǎng)格穩(wěn)健性之間取得平衡。假設(shè)某節(jié)點(diǎn)在進(jìn)入網(wǎng)格時(shí)帶有3個(gè)鄰居,隨后其中2個(gè)鄰居離開了網(wǎng)格,則該節(jié)點(diǎn)將開始一個(gè)維護(hù)周期以獲取新的鄰居。當(dāng)一個(gè)PeerChannel節(jié)點(diǎn)連有3個(gè)鄰居時(shí),則認(rèn)為它處于理想的連接狀態(tài),但一個(gè)節(jié)點(diǎn)可以接受多達(dá)7個(gè)鄰居,以便低于鄰居數(shù)最低閾值的節(jié)點(diǎn)能迅速獲得新的鄰居。應(yīng)注意的是,應(yīng)用程序不能更改這些閾值或?qū)W(wǎng)格的維護(hù)實(shí)施任何控制,這些細(xì)節(jié)問題完全由PeerChannel基礎(chǔ)結(jié)構(gòu)逐個(gè)節(jié)點(diǎn)地處理。

        PeerChannel提供了PNRP解析程序和自定義解析程序,用于預(yù)期節(jié)點(diǎn)發(fā)現(xiàn)網(wǎng)格中已有節(jié)點(diǎn)的地址。這兩種方法都將網(wǎng)格名傳遞給解析程序并接收網(wǎng)格中其他節(jié)點(diǎn)的IP地址列表。一旦解析進(jìn)程生成地址列表,預(yù)期PeerChannel節(jié)點(diǎn)就并發(fā)連接到每個(gè)地址。當(dāng)PeerChannel網(wǎng)格中已有的節(jié)點(diǎn)收到其中一個(gè)連接請(qǐng)求時(shí),它可以接受或拒絕該連接。如果接受該連接,則節(jié)點(diǎn)會(huì)向新連接的節(jié)點(diǎn)發(fā)送一條包含網(wǎng)格中其他節(jié)點(diǎn)地址列表的歡迎消息。如果拒絕該連接,則節(jié)點(diǎn)會(huì)向預(yù)期節(jié)點(diǎn)發(fā)送一條包含拒絕理由以及網(wǎng)格中其他節(jié)點(diǎn)地址列表的拒絕消息。

        PeerChannel向預(yù)期節(jié)點(diǎn)返回地址列表的方式,不限于網(wǎng)格名解析(通過PNRP解析程序或自定義解析程序執(zhí)行)。與將網(wǎng)格名解析作為預(yù)期節(jié)點(diǎn)獲取地址的惟一方法相比,這可使節(jié)點(diǎn)更快速地進(jìn)入理想的連接狀態(tài),也可使網(wǎng)格中的節(jié)點(diǎn)可對(duì)節(jié)點(diǎn)擁有的鄰居數(shù)(這一因素會(huì)進(jìn)而影響網(wǎng)格的穩(wěn)健性)進(jìn)行控制。

        PeerChannel網(wǎng)格內(nèi)節(jié)點(diǎn)問傳送消息的重復(fù)率和網(wǎng)絡(luò)帶寬消耗較低。網(wǎng)格中的節(jié)點(diǎn)在網(wǎng)格內(nèi)發(fā)送消息,實(shí)際上是在向其鄰居發(fā)送消息。收到消息后,每個(gè)鄰居都會(huì)檢驗(yàn)該消息,然后將其轉(zhuǎn)發(fā)給自己的鄰居。節(jié)點(diǎn)從某鄰居收到消息,不會(huì)將此消息轉(zhuǎn)發(fā)回該鄰居。此外,如果節(jié)點(diǎn)多次從某鄰居收到先前已收到并處理過的消息,則與該鄰居的連接會(huì)在下一個(gè)維護(hù)周期中終止。這些功能是通過節(jié)點(diǎn)上的本地高速緩存來實(shí)現(xiàn)的。PeerChannel網(wǎng)格中的每個(gè)節(jié)點(diǎn)都會(huì)對(duì)WS-Addressing消息ID的值和傳送消息的鄰居的標(biāo)識(shí)符進(jìn)行緩存處理,在決定向哪些鄰居傳送該消息時(shí)會(huì)檢查這個(gè)高速緩存。

        PeerChannel節(jié)點(diǎn)還可以將消息發(fā)送給網(wǎng)格中節(jié)點(diǎn)的子集。這通過向消息分配一個(gè)跳躍計(jì)數(shù)實(shí)現(xiàn)。跳躍計(jì)數(shù)是模糊界定接收消息的節(jié)點(diǎn)數(shù)的一種方法。例如,如果一個(gè)PeerChannel節(jié)點(diǎn)(節(jié)點(diǎn)A)有3個(gè)鄰居且在跳躍計(jì)數(shù)為1的情況下向網(wǎng)格發(fā)送一個(gè)消息,則該消息將被傳送到3個(gè)節(jié)點(diǎn)。同樣,如果節(jié)點(diǎn)A的每個(gè)鄰居也都有3個(gè)鄰居且節(jié)點(diǎn)A在跳躍計(jì)數(shù)為2的情況下向網(wǎng)格發(fā)送一個(gè)消息,則該消息將被傳送到9個(gè)節(jié)點(diǎn)。但如果節(jié)點(diǎn)A的任一鄰居有共用的鄰居,則此數(shù)字將相應(yīng)減少。

        從物理上說,跳躍計(jì)數(shù)在消息中被表示為標(biāo)頭塊中的一個(gè)整數(shù)。當(dāng)某節(jié)點(diǎn)收到帶有跳躍計(jì)數(shù)的消息時(shí),它會(huì)檢查跳躍計(jì)數(shù)的值。如果該值大于零,節(jié)點(diǎn)會(huì)單調(diào)遞減此跳躍計(jì)數(shù),然后將帶有遞減后的跳躍計(jì)數(shù)值的消息轉(zhuǎn)發(fā)給相應(yīng)鄰居。如果節(jié)點(diǎn)所接收消息中包含的跳躍計(jì)數(shù)為0,則不轉(zhuǎn)發(fā)該消息。需要注意的是,跳躍計(jì)數(shù)標(biāo)頭塊被排除在消息簽名之外,因此更改這個(gè)值不會(huì)影響到應(yīng)用于消息的數(shù)字簽名的完整性,而且會(huì)避免產(chǎn)生與重復(fù)生成數(shù)字簽名并將其序列化到消息相應(yīng)部分中的相關(guān)開銷。

        4 People Near Me

        PNM是集成在Windows Vista之中的一種網(wǎng)格技術(shù),它允許鄰近的設(shè)備組和人員組相互發(fā)現(xiàn)、連接、邀請(qǐng)并進(jìn)行協(xié)作。PNM是一項(xiàng)完全自選的網(wǎng)格技術(shù),默認(rèn)情況下處于關(guān)閉狀態(tài)。PNM體系結(jié)構(gòu)包含了一個(gè)稱為p2phost.exe的P2P應(yīng)用程序。此程序運(yùn)行時(shí),將通過連接到其他計(jì)算機(jī)上p2phost.exe的實(shí)例來創(chuàng)建網(wǎng)格。PNM用于解析本地節(jié)點(diǎn)并與這些本地節(jié)點(diǎn)的子集進(jìn)行通信。PNM API作為Windows API的一部分,主要用于配置p2phost.exe。

        5 PeerChannel實(shí)例

        利用PeerChannel構(gòu)建P2P應(yīng)用程序的步驟如下:

        (1)定義基本的Windows窗體樣板代碼。

        (2)向窗體添加控件。

        (3)定義必需的WCF服務(wù)合同。

        (4)編寫連接到網(wǎng)格和從網(wǎng)格接收消息的WCF代碼。

        (5)編寫向網(wǎng)格中其他節(jié)點(diǎn)發(fā)送消息的代碼。

        對(duì)于任何WCF應(yīng)用程序,開發(fā)過程的第一步是定義服務(wù)合同。PeerChannel要使用的服務(wù)合同類似于其他WCF合同,只不過PeerChannel中所有的OperationContractAttribute都將IsOneWay實(shí)例屬性設(shè)置為true。此屬性規(guī)定消息的接收方是否應(yīng)發(fā)送回復(fù)。如果想要接收方發(fā)送回復(fù),可以將服務(wù)合同定義為雙向合同,但每個(gè)OperationContractAttribute仍必須將IsOneWay實(shí)例屬性設(shè)置為true。定義合同代碼如下:

        [ServiceContract]

        interface IPictureViewer{

        [OpemtionContract(IsOneWay=true)]//

        void SharePicture(Stream stream)://SharePicture接口方法用

        OperationContractAttdbute屬性加以說明,并且IsOneWay實(shí)例屬性被設(shè)置為true。此操作將被用于向網(wǎng)格中其他節(jié)點(diǎn)傳送圖片的字節(jié)

        }

        在定義了服務(wù)合同后,需要添加WCF代碼,該代碼會(huì)將我們的應(yīng)用程序連接到PeerChannel網(wǎng)格并且被動(dòng)等待來自網(wǎng)格的消息。首先,在窗體中實(shí)現(xiàn)新定義的服務(wù)合同;然后,定義類型ServiceHost的字段。所接收的消息將被發(fā)送到frmPictureViewer類型的單個(gè)實(shí)例。要顯示此功能,我們必須將正確的ServiceBehavior分配給frmPictureViewer類型。

        接下來,必須對(duì)ServiceHost進(jìn)行實(shí)例化,添加端點(diǎn)并開始偵聽外來的消息。由于構(gòu)建的是Windows窗體應(yīng)用程序,因此實(shí)現(xiàn)此操作的邏輯位置就是窗體的構(gòu)造函數(shù)。到此,已經(jīng)完成了連接到網(wǎng)格并偵聽消息所需的所有步驟。與標(biāo)準(zhǔn)的WCF代碼相比,只在URI的方案(net.p2p)、所使用的綁定(NetPeerTcpBinding)以及所增添的基于密碼的安全性方面有所不同。

        只要調(diào)用了ServiceHost.Open,我們的應(yīng)用程序就會(huì)通過PNRP來解析網(wǎng)格名(pictureView)。此時(shí),可以通過運(yùn)行netsh命令以列出注冊(cè)的對(duì)等名稱來驗(yàn)證我們的PeerChannel應(yīng)用程序是否正在使用PNRP。如果PNRP可以將網(wǎng)格名解析為一個(gè)或多個(gè)IP地址,則我們的應(yīng)用程序?qū)L試連接到這些節(jié)點(diǎn)。如果不是這樣,則該節(jié)點(diǎn)將成為網(wǎng)格中的第一個(gè)節(jié)點(diǎn)。如前所述,現(xiàn)有節(jié)點(diǎn)將通過發(fā)送歡迎消息或拒絕消息來接受或拒絕連接。這種情況有可能在對(duì)ServiceHost.Open的調(diào)用返回后發(fā)生。

        加載共享圖片的代碼是Windows窗體基本代碼:首先,對(duì)OpenFileDialog進(jìn)行實(shí)例化,獲得一個(gè)Stream,將該Stream轉(zhuǎn)換為Image,然后通過PictureBox.Image屬性引用Image。實(shí)際上,要將圖像加載到PictureBox中,只需調(diào)用Sharepicmm方法,將從OperlFileDialog.OpenFile返回的Stream作為參數(shù)傳遞。

        要將包含圖片的消息發(fā)送到網(wǎng)格中的其他節(jié)點(diǎn),需要在類型ChannelFactory和IPictureViewer的窗體中定義一些字段,然后在窗體的構(gòu)造函數(shù)中將這些變量實(shí)例化。

        請(qǐng)注意,所使用的網(wǎng)格密碼和證書(用于創(chuàng)建消息的數(shù)字簽名)必須與設(shè)置ServiceHost時(shí)所用的相同。此外,其代碼也要與非PeerChannel WCF應(yīng)用程序中的代碼相同。

        構(gòu)建了發(fā)送基礎(chǔ)結(jié)構(gòu)后,就可以使用它向網(wǎng)格中的其他節(jié)點(diǎn)發(fā)送消息。為此只需為共享按鈕編寫一個(gè)如下所示的事件處理程序:

        private void btnShare_Click(object sender,EventArgs e)

        {using(MemoryStream stream=new Memo~Stream())

        {Image image=pbView.Image;

        image.Save(stream,ImageFormat.Jpeg);

        //將圖像存儲(chǔ)到stream中

        stream.Position=O;//復(fù)位位置

        channel.SharePicture(stream);//向網(wǎng)格發(fā)送消息

        }

        }

        6 結(jié)束語

        隨著Windows Vista和.NET Framework 3.0的發(fā)布,P2P應(yīng)用程序的開發(fā)門檻將明顯降低。我們相信,技術(shù)的進(jìn)步(如PNRP、IPv6)加上更具生產(chǎn)力的新型平臺(tái)的問世(如PeerChannel和PNM)將在P2P應(yīng)用程序開發(fā)領(lǐng)域開創(chuàng)一個(gè)新時(shí)代。最終,應(yīng)用程序?qū)⒏邊f(xié)作性,并完成我們?cè)瓉碇荒芟胂竦囊恍┕δ堋?/p>

        注:本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文。

        人妻 丝袜美腿 中文字幕| 国产欧美亚洲另类第一页| 国产后入内射在线观看| 午夜免费观看国产视频| 无码中文字幕日韩专区| 国产亚洲一区二区手机在线观看| 久久国产亚洲精品超碰热| 日本中文字幕一区二区在线观看| 亚洲av一区二区三区蜜桃| 日本最新免费二区| 日本精品一区二区三区在线视频 | 精品久久杨幂国产杨幂| 中文字幕视频一区懂色| 亚洲熟女精品中文字幕| 婷婷午夜天| 国产日韩久久久久69影院| 91色综合久久熟女系列| 国产精品欧美久久久久久日本一道| 国产mv在线天堂mv免费观看| 亚洲中文字幕日产喷水| 亚洲精品中文字幕导航| 久久婷婷人人澡人人爽人人爱| 久久亚洲欧洲无码中文| 日本中出熟女一区二区| 亚洲av久播在线一区二区| 九九久久精品无码专区| 无遮挡中文毛片免费观看| 视频一区精品中文字幕| 国产乱人偷精品人妻a片| 精品久久无码中文字幕| 亚洲乱码中文字幕综合69堂| 99久久精品在线视频| 亚洲中文字幕无码爆乳| 欧美成人高清手机在线视频| 自拍视频在线观看国产| 久久久久久九九99精品| 成人欧美在线视频| 日韩精品一区二区在线视| 日韩夜夜高潮夜夜爽无码| 国精产品一区二区三区| av永久天堂一区二区三区蜜桃|