国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

用Vista和WCF中P2P通信功能開發(fā)軟件

2019-11-17 04:52:46
字體:
供稿:網(wǎng)友

  在我們多數(shù)人考慮點(diǎn)對(duì)點(diǎn) (P2P) 應(yīng)用程序時(shí),自然而然就會(huì)想到即時(shí)消息傳送應(yīng)用程序、簡(jiǎn)單文件共享程序和游戲。一般情況下,在我們考慮分布式應(yīng)用程序設(shè)計(jì)時(shí),已經(jīng)習(xí)慣于默認(rèn)選擇客戶端/服務(wù)器模型,幾乎很少會(huì)想到 P2P 模型,哪怕是一閃而過的念頭,尤其是對(duì)于業(yè)務(wù)應(yīng)用程序更是如此。我們?yōu)槭裁炊缄P(guān)注于客戶端/服務(wù)器模型,其主要原因很簡(jiǎn)單:P2P 應(yīng)用程序的開發(fā)過程一慣都成本高昂且耗時(shí)過長(zhǎng)。

  從傳統(tǒng)意義來說,P2P 應(yīng)用程序開發(fā)所面臨的難題包括:需要開發(fā)用于消息交換的專用協(xié)議;必須查找并連接隱藏在“網(wǎng)絡(luò)地址轉(zhuǎn)換”(NAT) 或防火墻背后的某應(yīng)用程序的實(shí)例;需要支持在廣域網(wǎng) (WAN) 中定位各應(yīng)用程序所需的慣常基礎(chǔ)結(jié)構(gòu)。盡管上述難題可以克服,但已造成大量阻礙,這樣就導(dǎo)致我們很多人都從未想過 P2P 應(yīng)用程序所能提供的杰出的協(xié)作功能。

  這些阻礙將隨著 Windows Vista? 和附帶的 .NET Framework 3.0 版本的發(fā)布而明顯改善。在將 Windows Vista 的增強(qiáng)功能與“對(duì)等名稱解析協(xié)議”(PNRP)、People Near Me (PNM) 和 Windows? Communication Foundation 中引進(jìn)的 PeerChannel 功能相結(jié)合的情況下,我們又向 P2P 應(yīng)用程序跨進(jìn)了一大步。我個(gè)人期望在發(fā)布 Windows Vista 之后,P2P 的舞臺(tái)會(huì)更加絢麗多彩。

  Windows Vista 中的 P2P 開發(fā)是一個(gè)極其廣泛的主題,沒有任何一篇文章可以將其闡述完整。因此,我不會(huì)去嘗試完成這樣一個(gè)不可能的任務(wù),而是會(huì)介紹 Windows Vista 中一些不同的 P2P 技術(shù),并為您對(duì) P2P 開發(fā)工作提供背景資料。

  除了假定您已基本了解 Windows 窗體之外,我還假設(shè)您已略微熟悉 Windows Communication Foundation 應(yīng)用程序的編寫。假如情況并非如此,您可能希望通過閱讀 Windows SDK 或 wcf.netfx3.com/content/resources.aspx 中的部分內(nèi)容開始起步。

  P2P 基本原理:網(wǎng)格網(wǎng)絡(luò)

  在深入探討具體的 P2P 技術(shù)之前,研究 P2P 應(yīng)用程序的一些基本原理很重要。對(duì)初學(xué)者而言,P2P 應(yīng)用程序是一個(gè)與該應(yīng)用程序的其他實(shí)例直接相連的應(yīng)用程序。在 P2P 語言中,該應(yīng)用程序的每個(gè)實(shí)例都叫做一個(gè)節(jié)點(diǎn)。通常將這些節(jié)點(diǎn)連接和命名后的組合稱為網(wǎng)格。因此,推動(dòng) P2P 應(yīng)用程序開發(fā)的技術(shù)經(jīng)常被稱作網(wǎng)格技術(shù)。PNRP、PeerChannel(在 Windows Communication Foundation 中)和 PNM 都是 Windows Vista 中網(wǎng)格技術(shù)的例子。

  網(wǎng)格技術(shù) 所有 Windows Vista 網(wǎng)格技術(shù)所生成的網(wǎng)格在拓?fù)浣Y(jié)構(gòu)上都大致相同。通常來講,網(wǎng)格拓?fù)涫蔷W(wǎng)格中各節(jié)點(diǎn)間連接模式的抽象體現(xiàn)。為了解釋清楚,請(qǐng)?jiān)谀X海中設(shè)想一個(gè)網(wǎng)格。我敢斷定,您所設(shè)想的網(wǎng)格在某種程度上與圖 1 中所示的網(wǎng)格相似。

  用Vista和WCF中P2P通信功能開發(fā)軟件(圖一)
  圖 1 全連接網(wǎng)格

  圖 1 所示網(wǎng)格中四個(gè)節(jié)點(diǎn)中的每個(gè)節(jié)點(diǎn)都與網(wǎng)格中的其他所有節(jié)點(diǎn)相連。換言之,假如網(wǎng)格中有 N 個(gè)節(jié)點(diǎn),則每個(gè)節(jié)點(diǎn)都保持 N-1 個(gè)連接。我們將達(dá)到此標(biāo)準(zhǔn)的網(wǎng)格視為全連接網(wǎng)格。全連接網(wǎng)格很少被用作適合的方法;要了解原因,讓我們注重一下各節(jié)點(diǎn)間的連接。

  網(wǎng)格中的節(jié)點(diǎn)基本上都使用現(xiàn)有的常用傳輸方式進(jìn)行通信。與所有的現(xiàn)代操作系統(tǒng)一樣,Windows Vista 利用 TCP/ip 和 UDP 進(jìn)行網(wǎng)絡(luò)通信。假如 TCP/IP 是全連接網(wǎng)格所選的傳輸方式,那么由 N 個(gè)節(jié)點(diǎn)組成的全連接網(wǎng)格中的每個(gè)節(jié)點(diǎn)都必須創(chuàng)建或接收 N-1 個(gè)套接字。隨著 N 值的增加,此模型顯然變得不可行。例如,假如假定一個(gè) N=1000 的情況,那么每個(gè)節(jié)點(diǎn)都將需要保持 999 個(gè)套接字,這簡(jiǎn)直就行不通。

  要解決可伸縮性和 WAN 連接性的問題,您必須訴諸于部分連接的網(wǎng)格,如圖 2 中所示。顧名思義,部分連接網(wǎng)格中的節(jié)點(diǎn)只與網(wǎng)格中的其他少量節(jié)點(diǎn)相連。就 P2P 來說,這些相鄰的節(jié)點(diǎn)被稱作鄰居。通常來說,部分連接網(wǎng)格對(duì)每個(gè)節(jié)點(diǎn)的資源需求更少,從而大幅提高了網(wǎng)格的可伸縮性。從理論上講,部分連接網(wǎng)格的規(guī)??梢詳U(kuò)大到包括全球所有計(jì)算機(jī)上的所有應(yīng)用程序。

  用Vista和WCF中P2P通信功能開發(fā)軟件(圖二)
  圖 2 部分連接網(wǎng)格

  加入網(wǎng)格 節(jié)點(diǎn)加入網(wǎng)格的方式取決于所使用的網(wǎng)格技術(shù),但通常來講,預(yù)期節(jié)點(diǎn)必須用網(wǎng)格名來解析網(wǎng)格中已有的一個(gè)或多個(gè)節(jié)點(diǎn)的物理地址。假如您假設(shè)一個(gè)部分連接網(wǎng)格,網(wǎng)格名的解析結(jié)果就是網(wǎng)格中可用物理地址的一個(gè)子集。在接收到網(wǎng)格中一個(gè)或多個(gè)物理節(jié)點(diǎn)的物理地址后,預(yù)期節(jié)點(diǎn)必須立即連接到這些地址中的一個(gè)、部分或全部地址。連接到網(wǎng)格之后,新添加的節(jié)點(diǎn)必須立即讓自己預(yù)備好響應(yīng)來自其他預(yù)期節(jié)點(diǎn)的后續(xù)的網(wǎng)格名解析請(qǐng)求。

  網(wǎng)格名解析是一個(gè)復(fù)雜的主題。這種復(fù)雜性在很大程度上是因?yàn)?,在許多情況下,網(wǎng)格名解析要依靠于一個(gè)或更多的其他網(wǎng)格。為清楚說明問題,請(qǐng)想一下美國(guó)郵政局使用的網(wǎng)格。再具體點(diǎn)說,假定我需要向我的朋友 Rusty 郵寄一個(gè)包裹。要郵寄這個(gè)包裹,我可能需要去一個(gè)郵局。假如我不知道距離我最近的郵局地點(diǎn),我會(huì)到 Internet 上查找最近郵局的地址。從抽象意義上說,要“連接”到美國(guó)郵政局的網(wǎng)格需要我先訪問所有網(wǎng)格中最大的網(wǎng)格(即 Internet)才能解析最近的節(jié)點(diǎn)的地址。換言之,您可以使用一個(gè)網(wǎng)格去解析包含在另一個(gè)網(wǎng)格中的地址。我將在本文的 PNRP 部分具體討論這個(gè)概念。

  與其他節(jié)點(diǎn)通信 一旦節(jié)點(diǎn)連接到某網(wǎng)格,它就可以通過以下兩種方式之一與其他節(jié)點(diǎn)進(jìn)行通信:網(wǎng)格擴(kuò)散(也稱多方消息傳送),或定向消息傳送。顧名思義,網(wǎng)格擴(kuò)散是試圖將消息發(fā)送到網(wǎng)格中的所有節(jié)點(diǎn)。一般而言,網(wǎng)格中的某節(jié)點(diǎn)可通過將消息發(fā)送到它的所有鄰居而將消息傳播到其他所有節(jié)點(diǎn)。在接收到消息后,初始發(fā)送節(jié)點(diǎn)的鄰居負(fù)責(zé)將該消息轉(zhuǎn)發(fā)給它的鄰居,以此類推。相比之下,定向消息傳送指的是試圖將消息直接發(fā)送到網(wǎng)格中的某特定節(jié)點(diǎn)。在部分連接網(wǎng)格中,初始發(fā)送節(jié)點(diǎn)可能未與目標(biāo)接收節(jié)點(diǎn)相連。假如真是這樣,則初始發(fā)送節(jié)點(diǎn)必須將消息發(fā)送給它的一個(gè)或多個(gè)鄰居。其中某個(gè)鄰居可能會(huì)與目標(biāo)接收節(jié)點(diǎn)相連。假如是這樣,該鄰居就會(huì)將消息轉(zhuǎn)發(fā)給目標(biāo)接收節(jié)點(diǎn)。假如不是這樣,則該鄰居會(huì)推測(cè)它的哪個(gè)鄰居自身可能會(huì)與目標(biāo)接收節(jié)點(diǎn)相連。

  網(wǎng)格很少處于靜態(tài)。在多數(shù) P2P 應(yīng)用程序中,節(jié)點(diǎn)可能會(huì)頻繁加入和離開網(wǎng)格,可能是由于網(wǎng)絡(luò)連接變動(dòng)引起,也可能是由于在使用即時(shí)消息傳送應(yīng)用程序時(shí),用戶啟動(dòng)和終止應(yīng)用程序引起。除了網(wǎng)格中的自然變動(dòng)之外,多數(shù)網(wǎng)格技術(shù)都具備一些維護(hù)自身的機(jī)制。通常而言,網(wǎng)格維護(hù)的目標(biāo)就是修復(fù)或調(diào)整網(wǎng)格以使其更高效或更穩(wěn)健地運(yùn)行。要注重到每個(gè)網(wǎng)格技術(shù)實(shí)現(xiàn)網(wǎng)格維護(hù)的方式都不同,這一點(diǎn)很重要。
QQread.com 推出各大專業(yè)服務(wù)器評(píng)測(cè) linux服務(wù)器的安全性能 SUN服務(wù)器 HP服務(wù)器 DELL服務(wù)器 IBM服務(wù)器 聯(lián)想服務(wù)器 浪潮服務(wù)器 曙光服務(wù)器 同方服務(wù)器 華碩服務(wù)器 寶德服務(wù)器 對(duì)等名稱解析協(xié)議

  顧名思義,PNRP 旨在基于網(wǎng)格名等要素來解析物理地址。PNRP 可供帶有 Advanced Networking Pack 的 Windows xp Service Pack 1 (SP1) 以及 Windows XP SP2 和 Windows XP PRofessional x64 Edition 使用。Windows Vista 也將附帶 PNRP 版本 2。從最簡(jiǎn)單的層次看,PNRP 本身就是一個(gè)采用 Windows 服務(wù)形式的 P2P 應(yīng)用程序,并且 PNRP 節(jié)點(diǎn)的網(wǎng)格專用于發(fā)現(xiàn)加入到其他網(wǎng)格中的節(jié)點(diǎn)的物理地址。(有關(guān)此方面的具體信息,請(qǐng)參見提要欄中的“在 Windows XP 上安裝 PNRP”。)

  PNRP 和 IPv6 PNRP 構(gòu)建于 Internet 協(xié)議版本 6 (IPv6) 之上。由于 IPv6 對(duì)于多數(shù)開發(fā)人員而言還相當(dāng)生疏,因此在討論 PNRP 機(jī)制之前,非常有必要提及 IPv6 的至少一個(gè)重要方面。在 IPv6 中,地址是一個(gè) 128 位的值(這可能產(chǎn)生約 3.4×1038 種地址組合)。這種大小的 IPv6 地址池使 IPv6 的最重要功能之一 - 端對(duì)端尋址變?yōu)榭赡?,即使這些地址被分割為多個(gè)子網(wǎng)并隱藏在 NAT 之后。有關(guān) IPv6 以及使其能夠在 IPv4 基礎(chǔ)結(jié)構(gòu)中使用的技術(shù)的具體信息,請(qǐng)?jiān)L問 microsoft.com/technet/itsolutions/network/ipv6/introipv6.mspx。

  PNRP 示例 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。通過 netsh,您可以按以下所示向 PNRP 注冊(cè)一個(gè)新的 PNRP 名:

  c:/temp>netsh

  netsh>p2p pnrp peer

  netsh p2p pnrp peer>add 0.justinsmith

  Ok.

  命令行參數(shù) 0.justinsmith 即是 P2P 名。當(dāng)此命令執(zhí)行時(shí),PNRP 基礎(chǔ)結(jié)構(gòu)會(huì)生成一個(gè) PNRP ID,將該 PNRP ID 與 P2P 名相關(guān)聯(lián),并為該 PNRP ID 分配一個(gè) IPv6 和 IPv4 地址。假如您訪問另一臺(tái)已安裝 PNRP 并已將其啟動(dòng)的計(jì)算機(jī),則可以用以下 netsh 命令解析網(wǎng)格名 0.justinsmith:

  netsh p2p pnrp peer>resolve 0.justinsmith

  Resolve started...

  Found: Comment: gonzo

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

  192.168.42.100:8350 tcp

  現(xiàn)在需要解釋一下該解析命令的輸出。首先,Comment 字段代表注冊(cè)了 0.justinsmith 的計(jì)算機(jī)名稱(我在 Muppets 的基礎(chǔ)上為我的計(jì)算機(jī)命名)。該字段從 netsh 自動(dòng)填充,并且不能用作解析進(jìn)程的一部分。其次,注重一下分配給該節(jié)點(diǎn)的 IPv6 和 IPv4 地址。這是 netsh 和答應(yīng)通過 IPv4 網(wǎng)絡(luò)傳送 IPv6 通信量的 Teredo 轉(zhuǎn)移技術(shù)共同具備的一個(gè)功能。誠然,我只是淺顯地闡述了 PNRP,但我已經(jīng)表明了 PNRP 使我可以用 P2P 名來解析 IP 地址。有關(guān) PNRP 的具體信息,請(qǐng)?jiān)L問 microsoft.com/technet/prodtechnol/winxppro/deploy/p2pintro.mspx。

  PeerChannel

  Windows Communication Foundation 的主要優(yōu)點(diǎn)之一就是,它為許多不同類型的分布式應(yīng)用程序提供了一個(gè)通用的編程模型。例如,編寫一個(gè)基于 TCP/IP 通過二進(jìn)制編碼消息進(jìn)行通信的分布式應(yīng)用程序所需的代碼與編寫一個(gè)基于 HTTP 通過符合 WS-* 的可互操作的消息進(jìn)行通信的分布式應(yīng)用程序所需的代碼驚人地相似。Windows Communication Foundation 的一個(gè)鮮為人知的功能就是它支持使用這同一個(gè)通用編程模型來構(gòu)建 P2P 應(yīng)用程序。由于 Windows Communication Foundation 對(duì) P2P 應(yīng)用程序的支持,可能會(huì)有人將其視為一種網(wǎng)格技術(shù),但實(shí)際上,只有 PeerChannel Windows Communication Foundation 模塊才專用于構(gòu)建 P2P 應(yīng)用程序。因此,PeerChannel 這個(gè)術(shù)語通常用于指代 Windows Communication Foundation 的 P2P 功能。無論 Windows Communication Foundation 中的 PeerChannel 指代的是什么,它實(shí)際上消除了通常與 P2P 應(yīng)用程序開發(fā)相伴的所有復(fù)雜性,并且在我看來,它是 P2P 應(yīng)用程序開發(fā)領(lǐng)域的一個(gè)創(chuàng)新性突破。

  PeerChannel 網(wǎng)格 PeerChannel 網(wǎng)格是專為消息擴(kuò)散而設(shè)計(jì)。但 PeerChannel 包含了可將消息傳播到網(wǎng)格的一部分而不是整個(gè)網(wǎng)格的機(jī)制。因此,更準(zhǔn)確地說,PeerChannel 網(wǎng)格是專為多方消息傳送而設(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)。這種維護(hù)的作用就是使網(wǎng)格性能穩(wěn)健并且分布均勻。更具體點(diǎn)說,網(wǎng)格中的節(jié)點(diǎn)會(huì)設(shè)法將連接的鄰居數(shù)保持在兩到七個(gè)之間。這些閾值可使對(duì)本地節(jié)點(diǎn)的資源需求與保持網(wǎng)格穩(wěn)健性之間取得平衡。

  假如某節(jié)點(diǎn)在進(jìn)入網(wǎng)格時(shí)帶有三個(gè)鄰居,然后其中兩個(gè)鄰居離開網(wǎng)格,則該節(jié)點(diǎn)將開始一個(gè)維護(hù)周期以試圖獲取新的鄰居連接。同樣,假如一個(gè)節(jié)點(diǎn)連接的鄰居少于七個(gè),則它將接受新連接,直到它具有七個(gè)鄰居連接時(shí)為止。當(dāng)一個(gè) PeerChannel 節(jié)點(diǎn)連有三個(gè)鄰居時(shí),則認(rèn)為它處于理想的連接狀態(tài),但一個(gè)節(jié)點(diǎn)將接受多達(dá)七個(gè)鄰居,以便低于鄰居數(shù)最低閾值的節(jié)點(diǎn)可以迅速獲得新的鄰居。應(yīng)注重的是,您的應(yīng)用程序代碼不能更改這些閾值或?qū)W(wǎng)格的維護(hù)實(shí)施任何控制,這一點(diǎn)很重要。這些細(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)地址的方法。無論選擇哪個(gè)解析方法,主旨都是一樣的:將網(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í),它可以接受或拒絕該連接。假如接受該連接,則現(xiàn)有節(jié)點(diǎn)會(huì)向新連接的節(jié)點(diǎn)發(fā)送一條歡迎消息,消息中除了其他內(nèi)容之外,還包含網(wǎng)格中其他節(jié)點(diǎn)的地址列表。假如拒絕該連接,則現(xiàn)有節(jié)點(diǎn)會(huì)向預(yù)期節(jié)點(diǎn)發(fā)送一條拒絕消息,消息中包含拒絕理由以及網(wǎng)格中其他節(jié)點(diǎn)的地址列表。

  這里的重要一點(diǎn)是,網(wǎng)格名解析(通過 PNRP 解析程序或自定義解析程序執(zhí)行)不是向 PeerChannel 中預(yù)期節(jié)點(diǎn)返回地址列表的唯一方式。與將網(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)的通信被調(diào)整為盡量減少重復(fù)性的消息傳遞。當(dāng)網(wǎng)格中的某節(jié)點(diǎn)向該網(wǎng)格發(fā)送消息時(shí),實(shí)際上是在向其鄰居發(fā)送消息。當(dāng)收到消息后,每個(gè)鄰居都會(huì)檢驗(yàn)該消息,然后將其轉(zhuǎn)發(fā)給自己的鄰居。假如一個(gè) PeerChannel 節(jié)點(diǎn)從某鄰居收到消息,它不會(huì)將此消息轉(zhuǎn)發(fā)回該鄰居。此外,假如一個(gè) PeerChannel 節(jié)點(diǎn)經(jīng)常從某鄰居那里收到先前已收到并處理過的消息,則與該鄰居的連接可能會(huì)在下一個(gè)維護(hù)周期中終止。這些功能將通過每個(gè)節(jié)點(diǎn)上的本地高速緩存來實(shí)現(xiàn)。在內(nèi)部,PeerChannel 網(wǎng)格中的每個(gè)節(jié)點(diǎn)都會(huì)對(duì) WS-Addressing 消息 ID 的值和傳送消息的鄰居的標(biāo)識(shí)符進(jìn)行緩存處理。節(jié)點(diǎn)在決定向哪些鄰居傳送該消息時(shí)會(huì)檢查這個(gè)高速緩存。將這些功能相結(jié)合后,會(huì)將網(wǎng)格調(diào)整為以最低的重復(fù)率和網(wǎng)絡(luò)帶寬消耗來向網(wǎng)格中的各節(jié)點(diǎn)傳送消息。

  如前所述,PeerChannel 節(jié)點(diǎn)還可以將消息發(fā)送給網(wǎng)格中節(jié)點(diǎn)的子集。這可以通過向消息分配一個(gè)跳躍計(jì)數(shù)來實(shí)現(xiàn),這實(shí)際上是跟蹤轉(zhuǎn)發(fā)消息所經(jīng)由的節(jié)點(diǎn)數(shù)的方式。不要將這種機(jī)制與定向消息傳送相混淆,定向消息傳送是將消息傳送目標(biāo)鎖定在某個(gè)特定節(jié)點(diǎn)。更確切地說,跳躍計(jì)數(shù)是模糊界定接收消息的節(jié)點(diǎn)數(shù)的方式。例如,假如一個(gè) PeerChannel 節(jié)點(diǎn)(節(jié)點(diǎn) A)有三個(gè)鄰居且在跳躍計(jì)數(shù)為 1 的情況下向網(wǎng)格發(fā)送一個(gè)消息,則該消息將被傳送到三個(gè)節(jié)點(diǎn)。同樣,假如節(jié)點(diǎn) A 的每個(gè)鄰居也都有三個(gè)唯一鄰居且節(jié)點(diǎn) A 在跳躍計(jì)數(shù)為 2 的情況下向網(wǎng)格發(fā)送一個(gè)消息,則該消息將被傳送到九個(gè)節(jié)點(diǎn)。但假如節(jié)點(diǎn) A 的任一鄰居有共用的鄰居,則此數(shù)字將相應(yīng)減少。
QQread.com 推出各大專業(yè)服務(wù)器評(píng)測(cè) Linux服務(wù)器的安全性能 SUN服務(wù)器 HP服務(wù)器 DELL服務(wù)器 IBM服務(wù)器 聯(lián)想服務(wù)器 浪潮服務(wù)器 曙光服務(wù)器 同方服務(wù)器 華碩服務(wù)器 寶德服務(wù)器
  從物理上說,跳躍計(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)鄰居。假如所接收消息中包含的跳躍計(jì)數(shù)為 0,則不轉(zhuǎn)發(fā)該消息。另需注重的重要一點(diǎn)是,跳躍計(jì)數(shù)標(biāo)頭塊被排除在消息簽名之外,因此更改這個(gè)值不會(huì)影響到應(yīng)用于消息的數(shù)字簽名的完整性,而且會(huì)防止產(chǎn)生與重復(fù)生成數(shù)字簽名并將其序列化到消息相應(yīng)部分中所關(guān)聯(lián)的開銷。

  PeerChannel 示例 讓我們用 PeerChannel 和 Windows 窗體來構(gòu)建一個(gè)簡(jiǎn)單的 P2P 應(yīng)用程序,稱之為 PictureViewer。顧名思義,該應(yīng)用程序的用途是答應(yīng)網(wǎng)格中的所有節(jié)點(diǎn)可以查看同一張圖片。從高層次來說,構(gòu)建此應(yīng)用程序所需的步驟如下所示:

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

  2.向窗體添加控件。

  3.定義必需的 Windows Communication Foundation 服務(wù)合約。

  4.編寫連接到網(wǎng)格和從網(wǎng)格接收消息所需的 Windows Communication Foundation 代碼。

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

  圖 3 顯示了完成后的應(yīng)用程序。步驟 1 和 2 是開發(fā)任何 Windows 窗體應(yīng)用程序時(shí)所必需的步驟,因此我將不在這里對(duì)其說明。對(duì)于任何 Windows Communication Foundation 應(yīng)用程序,開發(fā)過程的第一步是定義服務(wù)合約。PeerChannel 要使用的服務(wù)合約類似于其他 Windows Communication Foundation 合約,只不過 PeerChannel 需要所有的 OperationContractAttribute 批注都將 IsOneWay 實(shí)例屬性設(shè)置為 true。此屬性規(guī)定消息的接收方不應(yīng)發(fā)送回復(fù)。假如想要接收方發(fā)送回復(fù),可以將服務(wù)合約定義為雙向合約,但每個(gè) OperationContractAttribute 批注仍必須將 IsOneWay 實(shí)例屬性設(shè)置為 true。就此例而言,我不會(huì)創(chuàng)建一個(gè)雙向合約(Windows SDK 中有幾個(gè)雙向合約的示例)。我要使用的合約如下所示:

[ServiceContract]
interface IPictureViewer {
 [OperationContract(IsOneWay = true)]
 void SharePicture(Stream stream);
}
  用Vista和WCF中P2P通信功能開發(fā)軟件(圖三)
  圖 3 PictureViewer P2P 應(yīng)用程序

  請(qǐng)注重,SharePicture 接口方法用 OperationContractAttribute 屬性加以批注,并且 IsOneWay 實(shí)例屬性被設(shè)置為 true。SharePicture 操作將 System.IO.Stream 視為一個(gè)參數(shù),因?yàn)榇瞬僮鲗⒈挥糜谙蚓W(wǎng)格中其他節(jié)點(diǎn)傳送圖片的字節(jié)。

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

  接下來,我必須對(duì) ServiceHost 進(jìn)行實(shí)例化,添加端點(diǎn)并開始偵聽外來的消息。由于我正在構(gòu)建 Windows 窗體應(yīng)用程序,因此實(shí)現(xiàn)此操作的邏輯位置就是窗體的構(gòu)造函數(shù),如圖 5 所示。

  此時(shí),我已經(jīng)完成了要連接到網(wǎng)格并偵聽消息所需的所有步驟。與標(biāo)準(zhǔn)的 Windows Communication Foundation 代碼相比,不同之處只在于 Uri 的方案 (net.p2p)、所使用的綁定 (NetPeerTcpBinding) 以及所增添的基于密碼的安全性。請(qǐng)注重,我已選擇將網(wǎng)格密碼直接置于代碼中,這一點(diǎn)很重要。假如想要使網(wǎng)格密碼保密,請(qǐng)不要在您當(dāng)前所使用的應(yīng)用程序中如此操作。

  只要調(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ā)送歡迎消息或拒絕消息來接受或拒絕連接。這里的重要一點(diǎn)是,這種情況有可能在對(duì) ServiceHost.Open 的調(diào)用返回后發(fā)生。

  將消息發(fā)送到其他節(jié)點(diǎn) 在共享圖片之前,我必須首先加載圖片。實(shí)現(xiàn)此操作所需的代碼是 Windows 窗體基本代碼:首先,對(duì) OpenFileDialog 進(jìn)行實(shí)例化,獲得一個(gè) Stream,將該 Stream 轉(zhuǎn)換為 Image,然后通過 PictureBox.Image 屬性引用 Image。等一下,這不是 SharePicture 方法所執(zhí)行的操作嗎?事實(shí)上,確實(shí)如此。從本質(zhì)上說,要將圖像加載到 PictureBox 中,我只需要調(diào)用 SharePicture 方法,將從 OpenFileDialog.OpenFile 返回的 Stream 作為一個(gè)參數(shù)傳遞。

  要將包含圖片的消息發(fā)送到網(wǎng)格中的其他節(jié)點(diǎn),我必須編寫幾行代碼,但是此代碼與您在其他任何 Windows Communication Foundation 應(yīng)用程序中編寫的代碼幾乎相同。起初,我需要在類型 ChannelFactory 和 IPictureViewer 的窗體中定義一些字段。接下來,我需要在窗體的構(gòu)造函數(shù)中將這些變量實(shí)例化。這些步驟如圖 6 所示。

  請(qǐng)注重,所使用的網(wǎng)格密碼和證書(用于創(chuàng)建消息的數(shù)字簽名)與設(shè)置 ServiceHost 時(shí)所用的必須是同一個(gè)。除此之外,此代碼要與非 PeerChannel Windows Communication Foundation 應(yīng)用程序中所需的代碼相同。

  既然我已經(jī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 MemoryStream())
 {
  Image image = pbView.Image;
  image.Save(stream, ImageFormat.Jpeg); // 將圖像存儲(chǔ)到 stream 中
  stream.Position = 0; // 復(fù)位位置
  channel.SharePicture(stream); // 向網(wǎng)格發(fā)送消息
 }
}
  簡(jiǎn)言之,PeerChannel 大大簡(jiǎn)化了 P2P 應(yīng)用程序的開發(fā)。PictureViewer 的完全功能版約有 150 行源代碼,其中大部分代碼專用于 Windows 窗體基礎(chǔ)結(jié)構(gòu)。這個(gè)功能完全的應(yīng)用程序包含了一個(gè)跳躍計(jì)數(shù)實(shí)現(xiàn),可以從 MSDN?雜志網(wǎng)站下載。

  People Near Me

  PNM 是集成在 Windows Vista 之中的一種網(wǎng)格技術(shù),它答應(yīng)鄰近的設(shè)備組和人員組相互發(fā)現(xiàn)、連接、邀請(qǐng)并進(jìn)行協(xié)作。PNM 非凡適用于這樣一些任務(wù):在咖啡店與鄰座其他幾個(gè)人一起玩游戲;與同事共享您的桌面;甚至連接到會(huì)議室中的投影儀,等等。PNM 提供的這些功能如此強(qiáng)大,我們有理由假設(shè),一旦它被發(fā)布,開發(fā)人員社區(qū)就將會(huì)找到新的、具有獨(dú)創(chuàng)性的方式來利用此技術(shù)。重要的是,要注重 PNM 是一項(xiàng)完全自選的網(wǎng)格技術(shù),在默認(rèn)情況下是關(guān)閉狀態(tài)。

  除其他應(yīng)用程序之外,PNM 體系結(jié)構(gòu)包含了一個(gè)稱為 p2phost.exe 的 P2P 應(yīng)用程序。此進(jìn)程運(yùn)行時(shí),將通過連接到其他計(jì)算機(jī)上 p2phost.exe 的實(shí)例來創(chuàng)建網(wǎng)格。通常而言,此網(wǎng)格的用途是定向消息傳送。更確切地說,PNM 用于解析本地節(jié)點(diǎn)并與這些本地節(jié)點(diǎn)的子集進(jìn)行通信。PNM API 作為 Windows API 的一部分提供,并且多半程度上側(cè)重于配置 p2phost.exe 的行為。

  總的來說,PNM API 的主要類別包括函數(shù)、結(jié)構(gòu)、事件和錯(cuò)誤代碼,通過這些類別可以向 PNM 注冊(cè)應(yīng)用程序、邀請(qǐng)其他人加入?yún)f(xié)作會(huì)話、啟動(dòng)已注冊(cè)的應(yīng)用程序、創(chuàng)建持久性合約并邀請(qǐng)不再屬于本地的聯(lián)系人。提要欄中的“真實(shí)環(huán)境中 People Near Me 的示例”將例示此過程。請(qǐng)注重,不支持應(yīng)用程序使用 PNM 進(jìn)行通信。就 PictureViewer 而言,這表示在提要欄中說明的 Tom 和 Harry 的 PictureViewer 實(shí)例之間傳遞的消息仍由 PeerChannel 來處理。

  結(jié)束語

  P2P 應(yīng)用程序開發(fā)是一個(gè)涉及范圍非常廣泛的主題,并且對(duì)于多數(shù)開發(fā)人員而言還相當(dāng)生疏。隨著 Windows Vista 和 .NET Framework 3.0 的發(fā)布,P2P 應(yīng)用程序的傳統(tǒ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é)作性,并提供我們起初只能想像的一些功能。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 汝南县| 衡南县| 黄大仙区| 潮安县| 永修县| 和田县| 洛阳市| 望谟县| 宁安市| 右玉县| 时尚| 台北县| 杂多县| 宁德市| 额济纳旗| 珲春市| 昭觉县| 平邑县| 长治市| 娄底市| 买车| 信宜市| 门源| 繁昌县| 达孜县| 抚松县| 淳安县| 江孜县| 城固县| 改则县| 齐河县| 鄂托克前旗| 专栏| 安化县| 临夏县| 武平县| 习水县| 无棣县| 乌兰浩特市| 隆德县| 葫芦岛市|