自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C#網(wǎng)絡(luò)編程系列八:P2P編程

開發(fā) 后端
首先,現(xiàn)在大家熟知的BT、電驢、迅雷、QQ、MSN和PPlive等都是基于P2P方式實現(xiàn)的軟件,并且對等聯(lián)網(wǎng)(Peer to Peer,P2P)將是互聯(lián)網(wǎng)的發(fā)展方向,因此對于P2P技術(shù)的了解顯得非常的重要,下面就來介紹下P2P架構(gòu)

引言:前面的介紹專題中有朋友向我留言說介紹下關(guān)于P2P相關(guān)的內(nèi)容的,首先本人對于C#網(wǎng)絡(luò)編程也不是什么大牛,因為能力的關(guān)系,也只能把自己的一些學(xué)習(xí)過程和自己的一些學(xué)習(xí)過程中的理解和大家分享下的,下面就進入正題——P2P(Peer to Peer)編程

一、P2P的介紹

首先,現(xiàn)在大家熟知的BT、電驢、迅雷、QQ、MSN和PPlive等都是基于P2P方式實現(xiàn)的軟件,并且對等聯(lián)網(wǎng)(Peer to Peer,P2P)將是互聯(lián)網(wǎng)的發(fā)展方向,因此對于P2P技術(shù)的了解顯得非常的重要,下面就來介紹下P2P架構(gòu):

在P2P技術(shù)之前,我們所有的網(wǎng)絡(luò)應(yīng)用都采用C/S或者B/S架構(gòu)來實現(xiàn)的,然而在之前C/S架構(gòu)的應(yīng)用程序中,客戶端軟件向服務(wù)器發(fā)出請求,服務(wù)器然后對客戶端請求做出響應(yīng),在這種情況下,如果客戶端越多,此時服務(wù)器的壓力就越大。然而采用P2P技術(shù)實現(xiàn)的每臺計算機既是客戶端,也是服務(wù)器,他們的功能都是對等的。對于安裝了P2P軟件(如迅雷,QQ等)的計算機加入一個共同的P2P網(wǎng)絡(luò),網(wǎng)絡(luò)中的節(jié)點之間可以直接進行數(shù)據(jù)傳輸和通信。

1.1 P2P架構(gòu)和C/S架構(gòu)的比較

C/S架構(gòu)有下面的缺點(其實上面的簡單介紹中也講到過):

1. 服務(wù)器負擔(dān)過重。當(dāng)大量用戶訪問C/S系統(tǒng)的服務(wù)器時,服務(wù)器常常會出現(xiàn)網(wǎng)絡(luò)堵塞等現(xiàn)象,這時候,我們可能會通過增加投資提高服務(wù)器的硬件性能

2. 系統(tǒng)穩(wěn)健性和服務(wù)器關(guān)聯(lián)密切。指的是——如果服務(wù)器出現(xiàn)了問題時,整個系統(tǒng)的運行將會癱瘓(感覺是面向?qū)ο笾薪?jīng)常強調(diào)的原則——低耦合原則)

然而P2P具有下面的特點:

1.對等模式

P2P系統(tǒng)中的客戶端能夠同時扮演客戶端和服務(wù)器的角色,使兩臺計算機之間能夠不通過服務(wù)器直接進行信息分享(QQ中當(dāng)好友在線的時候發(fā)信息時,相信此時是不需要經(jīng)過服務(wù)器轉(zhuǎn)發(fā)的,只有當(dāng)給離線好友發(fā)送消息時,此時應(yīng)該會先把消息發(fā)送到服務(wù)器端存儲起來,當(dāng)好友再次登錄的時候,會和服務(wù)器進行連接,服務(wù)器會進行判斷是不是給這個用戶的信息來決定是否轉(zhuǎn)發(fā),QQ軟件的實現(xiàn)屬于混合型P2P結(jié)構(gòu)的, 這個會在后面的P2P系統(tǒng)分類中介紹。)

注:括號中都是我個人的一些理解,如果有什么說錯的地方請大家及時更正我,這樣我會及時的更新以免誤導(dǎo)大家,謝謝大家監(jiān)督。

2. 網(wǎng)絡(luò)資源的分布式存儲

在C/S架構(gòu)中,所有客戶端都直接從服務(wù)器下載所有數(shù)據(jù)資源,這樣勢必會加重服務(wù)器的負擔(dān),而P2P則改變了以服務(wù)器為中心的狀態(tài),使每個節(jié)點可以先從服務(wù)器上個下載一部分,然后再相互從對方或者其他節(jié)點下載其余部分。采用這種方式,當(dāng)大量客戶端同時下載時,就不會形成網(wǎng)絡(luò)堵塞現(xiàn)象了。

1.2 P2P系統(tǒng)的分類

使用P2P技術(shù)的系統(tǒng)分為兩類:

(1)單純型P2P——沒有專用的服務(wù)器。安裝了P2P軟件的各個計算機可以直接通信

(2)混合型P2P——有專用的服務(wù)器,此時的服務(wù)器一般叫索引服務(wù)器,此服務(wù)器與C/S架構(gòu)下的服務(wù)器不同,在C/S架構(gòu)下所有資源都存儲在服務(wù)器中,所有傳遞的信息都要經(jīng)過服務(wù)器,而在混合型P2P系統(tǒng)中的索引服務(wù)器僅僅起到協(xié)調(diào)和擴展的功能,資源不是全部存儲在服務(wù)器上,而是分布在各個電腦上,安裝了P2P軟件的電腦開始全部和索引服務(wù)器連接,以便告知自己監(jiān)聽的IP地址和端口號,然后再通過索引服務(wù)器告訴其他與自己連接的電腦,每臺計算機的連接和斷開都通過服務(wù)器通知網(wǎng)絡(luò)上有聯(lián)系的計算機,這樣就減輕了每臺計算機搜索其他計算機的負擔(dān),但是信息的傳遞還是通過點對點的方式來完成(這里可以以QQ為例,當(dāng)我們電腦上安裝了QQ這類P2P軟件時,安裝了QQ這類軟件的計算機就會加入一個P2P網(wǎng)絡(luò),并且登陸的時候都會與索引服務(wù)器建立連接,通過連接來告訴服務(wù)器自己的IP地址和端口號,當(dāng)我們找一個好友聊天時,此時自己的計算機和好友的計算機都會與服務(wù)器端口連接,但是要互相發(fā)送消息,自己的計算機必須知道好友計算機的IP地址和端口號才可以通信,這樣的工作正是通過索引服務(wù)器來告知對方的--指的是告訴自己的計算機好友的計算機的IP地址和端口號,告訴好友的計算機自己的IP地址和端口號,這樣雙方就可以不通過服務(wù)器直接通信了。)

1.3 主流P2P應(yīng)用分類

P2P 網(wǎng)絡(luò)應(yīng)用大致可以分為三類

1. 文件共享類,例如迅雷,BT等軟件都是文件共享類的應(yīng)用

2. 即時通信類,例如QQ,MSN等軟件都是屬于即時通信類

3. 多媒體傳輸類,例如在線視頻直播軟件,PPlive等軟件

從上面的分類可以看出,現(xiàn)在網(wǎng)絡(luò)上流行的軟件都采用了P2P技術(shù)來實現(xiàn)的, 但是它們的實現(xiàn)肯定不是單純的只采用P2P技術(shù)來實現(xiàn)的, 而是采用多種技術(shù)來實現(xiàn)的, 在下一專題中將介紹利用TCP,UDP和P2P等技術(shù)來實現(xiàn)類似QQ的一個即時通信程序,希望通過此程序可以綜合前面專題介紹的內(nèi)容以及幫助大家對QQ等軟件的實現(xiàn)原理有了解。

二、P2P的基本原理

在前面我們對P2P的一些知識進行的簡單的介紹, 通過前面的介紹相信大家對P2P的技術(shù)有了一定的了解,但是要自己開發(fā)一個P2P的應(yīng)用當(dāng)然必須了解P2P技術(shù)的實現(xiàn)原理的,下面就介紹下P2P實施的基本原理。

安裝了P2P軟件后,首先雙方要進行通信,必須能夠發(fā)現(xiàn)對方(指的就是知道對方的IP地址和端口號),一旦發(fā)現(xiàn)了對方后才可以進行通信,所以P2P應(yīng)用程序一般分為發(fā)現(xiàn)、連接和通信3個階段。 發(fā)現(xiàn)階段負責(zé)動態(tài)定位通信方的網(wǎng)絡(luò)位置;連接階段負責(zé)在雙方建立網(wǎng)絡(luò)連接,通信階段負責(zé)在雙方之間傳輸數(shù)據(jù)。

2.1 發(fā)現(xiàn)階段

一臺計算機要和另外一臺計算機通信,必須知道對方的IP地址和監(jiān)聽端口,否則就無法向?qū)Ψ桨l(fā)送消息。在之前的C/S架構(gòu)中,服務(wù)器的IP地址一般固定不變的,并且提供服務(wù)的計算機域名也一般不會改變,所以為了方便客戶端訪問,一些Web服務(wù)器在DNS(DNS其實就是域名和IP地址的一個映射)中進行了注冊,客戶機可以利用域名解析機制將服務(wù)器域名解析為IP地址,然后在P2P應(yīng)用中,各個對等節(jié)點(計算機或資源)可以隨時加入和隨時離開,并且對等節(jié)點的IP地址也不是固定的,所以不能采用DNS的機制來獲取P2P架構(gòu)中的對等節(jié)點的信息。

目前,在單純型P2P中,針對如何發(fā)現(xiàn)對等節(jié)點,各種P2P技術(shù)采用的協(xié)議和標準都不一樣,微軟在.net 支持對等名稱解析協(xié)議(Peer name Resolution Protocol, PNRP),該協(xié)議可以發(fā)現(xiàn)對等節(jié)點的信息,通過無服務(wù)器的解析功能將任何資源解析為一組IP地址和端口號,在后面的實現(xiàn)的簡單程序用的就是這個協(xié)議來完成發(fā)現(xiàn)階段的。

2.2 連接和通信階段

完成對等節(jié)點的發(fā)現(xiàn)后,接下來就可以根據(jù)需要,選擇TCP、UDP或者其他協(xié)議完成數(shù)據(jù)傳輸。如果選擇TCP,則需要先建立連接,再利用該連接傳輸數(shù)據(jù),關(guān)于TCP的內(nèi)容可以查看我之前的專題;如果選擇UDP,則無須建立連接,直接在對等節(jié)點之間通信就可以了。

三、.net平臺對P2P編程的支持

之前在發(fā)現(xiàn)階段也介紹了.Net平臺對P2P編程的支持的,然后微軟幫我們已經(jīng)封裝好了對PNRP協(xié)議的實現(xiàn),這些類在System.Net.PeerToPeer命名空間里(微軟現(xiàn)在很多東西都幫我們封裝了,這樣可以方便我們開發(fā)應(yīng)用程序,感覺微軟的做的東西都是這樣,把程序的實現(xiàn)都幫我們做好了,我們開發(fā)程序的時候只要關(guān)注業(yè)務(wù)邏輯就好了的, 這樣做當(dāng)然有好處也有壞處的, 我覺得好處就是縮短軟件的開發(fā)周期,讓花更多的時間去實現(xiàn)軟件真真的業(yè)務(wù)邏輯方面的東西,不好的地方就是現(xiàn)在的程序員就不能叫程序員,所以園子里面有很多人都稱碼農(nóng),這些我自己的觀點了)

3.1 對等名稱解析協(xié)議(PNRP)

PNRP可以完成對等名稱的注冊和解析(可以和DNS對比來理解)。

3.1.1 基本概念

第一個介紹的是對等名稱的概念,我們將每一個網(wǎng)絡(luò)資源(包括計算機,P2P應(yīng)用程序、視頻、Mp3或其他文檔等資源)抽象為對等節(jié)點,對等節(jié)點名稱當(dāng)然就是對等節(jié)點的名稱。對等節(jié)點名稱簡稱為對等名,分為安全的和不安全的兩種形式,不安全的名稱僅由文本字符串組成,任何人都可以注冊一個相同的不安全對等名稱;安全的由一個公鑰/私鑰(代表唯一)對支持,所以使用PNRP注冊時,不會受到欺騙,對等名稱的格式如下:

Authority.Classifier

Authority的值取決于該名稱的安全類型。對于不安全的類型,Authority為單字符“0”,而對于安全的對等名稱,Authority由40個十六機制字符組成

Classifier是用戶定義的用于標志對等節(jié)點的字符串,最大長度為150個Unicode字符。例如,對等名稱0.PeerNametest1就是一個不安全的對等名稱。

第二個概念就是云(Cloud)的概念,安裝了相同P2P軟件的計算機會加入一個共同的P2P網(wǎng)絡(luò)中,才能相互識別各自擁有的資源并順利進行P2P通信。微軟PNPR協(xié)議將這個P2P網(wǎng)絡(luò)稱為“云”。云是指一組可以通過P2P網(wǎng)絡(luò)相互識別的對等節(jié)點及其上資源的集合。云中的所有對等節(jié)點都可以解析注冊到該云中的其他任何資源所在的位置(IP+Port),一個對等節(jié)點上的某個資源可以同時注冊到多個云中。

PNPR目前使用了兩種云——本地云和全局云。一個對等名稱若注冊到鏈接一本地云,就意味著只有同一本地網(wǎng)絡(luò)上的其他對等節(jié)點可以解析該名稱。而注冊到全局云上的對等名稱則允許IPv6互聯(lián)網(wǎng)的任何對等節(jié)點解析。

注:全局云是基于IPv6協(xié)議的,并不支持IPv4,如果不存在IPv6地址,則不會出現(xiàn)全局云,也無法加入全局云。由于現(xiàn)在網(wǎng)上絕大多數(shù)應(yīng)用使用的仍然是IPv4的地址,所以我們通常的P2P編程還用不到全局云,而只能使用默認的本地云。

3.1.2 名稱注冊

任何資源要被網(wǎng)絡(luò)上的其他計算機識別到,首先必須注冊進P2P網(wǎng)絡(luò),名稱注冊就是將包含對等節(jié)點信息的對等名稱發(fā)布到云中,以便其他對等節(jié)點解析。一個資源如果注冊到云中后,就可以被云中的其他對等節(jié)點解析和訪問。

關(guān)于名稱注冊的具體內(nèi)容,在后面的P2P的程序中也會使用的, 相信大家可以通過代碼來進一步理解名稱的注冊,這里就先介紹到這里的

3.1.3 名稱解析

名稱解析是指利用對等名稱獲取到云中資源所在對等節(jié)點的IP地址和端口號的過程(和DNS解析原理一樣)。PNPR名稱解析僅能夠注冊到云中的其他對等節(jié)點資源,而不能發(fā)現(xiàn)自身注冊的資源

PNPR協(xié)議沒有使用索引服務(wù)器,所以為了完成解析,云中的每個對等節(jié)點都存儲一些PNRP ID的緩存記錄。PNPR緩存中的都含有PNPR ID和應(yīng)用程序的IP地址和端口號。名稱解析的步驟為——首先在本地計算機對等節(jié)點的緩存中查找目標資源,如果沒有,則在緩存中的臨近節(jié)點查看,這樣循環(huán)下去,直到找到目標資源所在的對等節(jié)點位置。

3.2 PeerToPeer命名空間

上面主要介紹了PNPR協(xié)議的工作過程(相當(dāng)于是理論部分了),下面就介紹下.net 為我們封裝好PNPR的類的使用。這里就簡單指明幾個常用類的使用,并附上MSDN的鏈接,大家可以直接點鏈接進行查看詳細內(nèi)容,因為后面的P2P程序中也有具體的使用,所以這里就不一一列出來了。

類名

MSDN鏈接

Peer

http://msdn.microsoft.com/zh-cn/library/system.net.peertopeer.collaboration.peer.aspx

Cloud

http://msdn.microsoft.com/zh-cn/library/system.net.peertopeer.cloud.aspx

PeerName

http://msdn.microsoft.com/zh-cn/library/system.net.peertopeer.peername.aspx

PeerNameRecord

http://msdn.microsoft.com/zh-cn/library/system.net.peertopeer.peernamerecord.aspx

PeerNameRegistration

http://msdn.microsoft.com/zh-cn/library/system.net.peertopeer.peernameregistration_members(v=VS.90).aspx

PeerNameResolver

http://msdn.microsoft.com/zh-cn/library/system.net.peertopeer.peernameresolver.aspx

這些類基本上從類名都可以大致知道他們的用途的,所以在這里就沒有一一介紹的,只是附上了MSDN的鏈接。

四、實現(xiàn)P2P應(yīng)用程序

以上介紹了那么多P2P的相關(guān)的知識,主要是為了實現(xiàn)一個自定義的P2P應(yīng)用程序做準備的,這里就簡單實現(xiàn)了資源發(fā)現(xiàn)的一個程序。

核心代碼:

對等名稱的注冊代碼:

  1. // 注冊資源  
  2.        private void btnRegister_Click(object sender, EventArgs e)  
  3.        {  
  4.            if (tbxResourceName.Text == "")  
  5.            {  
  6.                MessageBox.Show("請輸入發(fā)布的資源名!""提示");  
  7.                return;  
  8.            }  
  9.  
  10.            // 將資源名注冊到云中  
  11.            // 具體資源名的結(jié)構(gòu)在博客有介紹  
  12.            PeerName resourceName = new PeerName(tbxResourceName.Text, PeerNameType.Unsecured);  
  13.            // 用指定的名稱和端口號初始化PeerNameRegistration類的實例  
  14.            resourceNameReg[seedCount] = new PeerNameRegistration(resourceName, int.Parse(tbxlocalport.Text));  
  15.            // 設(shè)置在云中注冊的對等名對象的其他信息的注釋  
  16.            resourceNameReg[seedCount].Comment =resourceName.ToString();  
  17.            // 設(shè)置PeerNameRegistration對象的應(yīng)用程序定義的二進制數(shù)據(jù)  
  18.            resourceNameReg[seedCount].Data = Encoding.UTF8.GetBytes(string.Format("{0}", DateTime.Now.ToString()));  
  19.            // 在云中注冊PeerName(對等名)  
  20.            resourceNameReg[seedCount].Start();  
  21.            seedCount++;  
  22.            comboxSharelist.Items.Add(resourceName.ToString());  
  23.            tbxResourceName.Text = "";  
  24.        } 

名稱解析代碼(搜索資源):

  1. // 搜索資源  
  2.       private void btnSearch_Click(object sender, EventArgs e)  
  3.       {  
  4.           if (tbxSeed.Text == "")  
  5.           {  
  6.               MessageBox.Show("請先輸入要尋找的種子資源名""提示");  
  7.               return;  
  8.           }  
  9.  
  10.           lstViewOnlinePeer.Items.Clear();  
  11.           // 初始化要搜索的資源名  
  12.           PeerName searchSeed = new PeerName("0." + tbxSeed.Text);  
  13.           // PeerNameResolver類是將節(jié)點名解析為PeerNameRecord的值(即將通過資源名來查找資源名所在的地址,包括IP地址和端口號)  
  14.           // PeerNameRecord用來定于云中的各個節(jié)點  
  15.           PeerNameResolver myresolver = new PeerNameResolver();  
  16.  
  17.           // PeerNameRecordCollection表示PeerNameRecord元素的容器  
  18.           // Resolve方法是同步的完成解析  
  19.           // 使用同步方法可能會出現(xiàn)界面“假死”現(xiàn)象  
  20.           // 解決界面假死現(xiàn)象可以采用多線程或異步的方式  
  21.           // 關(guān)于多線程的知識可以參考本人博客中多線程系列我前面UDP編程中有所使用  
  22.           // 在這里就不列出多線程的使用了,朋友可以自己實現(xiàn),如果有問題可以留言給我一起討論  
  23.           PeerNameRecordCollection recordCollection = myresolver.Resolve(searchSeed);  
  24.           foreach (PeerNameRecord record in recordCollection)  
  25.           {  
  26.               foreach(IPEndPoint endpoint in record.EndPointCollection)  
  27.               {  
  28.                   if (endpoint.AddressFamily.Equals(AddressFamily.InterNetwork))  
  29.                   {  
  30.                       ListViewItem item = new ListViewItem();     
  31.                       item.SubItems.Add(endpoint.ToString());  
  32.                       item.SubItems.Add(Encoding.UTF8.GetString(record.Data));  
  33.                       lstViewOnlinePeer.Items.Add(item);  
  34.                   }  
  35.               }  
  36.           }  
  37.       } 

運行結(jié)果截圖:

為了演示資源發(fā)現(xiàn)的效果,所以同時開啟了本程序的3個進程來模擬網(wǎng)絡(luò)上對等的3個計算機節(jié)點,當(dāng)在資源名中輸入資源后會在分享下列表中顯示出本地分享的資源,同時在P2P網(wǎng)絡(luò)上的其他計算機可以通過資源名稱搜索該資源,將得到的資源名稱和發(fā)布時間顯示在ListView控件中,下面是程序的運行結(jié)果:

五、總結(jié)

到這里P2P編程的介紹就結(jié)束了, 本專題只是簡單演示了一個資源發(fā)現(xiàn)的程序,資源發(fā)現(xiàn)是P2P的核心技術(shù),正是因為P2P技術(shù)實現(xiàn)了互聯(lián)網(wǎng)范圍的資源發(fā)現(xiàn),才使得它被廣泛應(yīng)用,像我們經(jīng)常用的下載工具——迅雷,迅雷就是典型采用P2P技術(shù)的應(yīng)用程序,當(dāng)我們在迅雷頁面中輸入“愛情公寓3”(相當(dāng)于本專題中種子文本框填的資源名)然后點擊搜索后迅雷會自動啟動“狗狗搜索”并顯示資源鏈接列表,當(dāng)我們點擊連接就可以進行下載了。不過迅雷肯定不是使用微軟的PNPR,而是迅雷自主研發(fā)的與PNPR作用一樣的協(xié)議——都是完成解析網(wǎng)絡(luò)資源的地址的作用,當(dāng)然,迅雷軟件中也采用了其他的一些技術(shù),如搜索引擎等。

希望本專題可以幫助大家對P2P技術(shù)有所了解,如果有任何的問題都可以通過留言的方式來一起討論,在下一個專題中將介紹實現(xiàn)一個類似QQ的程序。

源碼附上:http://files.cnblogs.com/zhili/P2PResourceDiscovery.zip ,希望覺得有幫助的朋友可以推薦下。謝謝支持

原文鏈接:http://www.cnblogs.com/zhili/archive/2012/09/14/P2P_PNPR.html

【編輯推薦】

    1. C#網(wǎng)絡(luò)編程系列一:網(wǎng)絡(luò)協(xié)議簡介
    2. C#網(wǎng)絡(luò)編程系列二:HTTP協(xié)議詳解
    3. C#網(wǎng)絡(luò)編程系列三:自定義Web服務(wù)器
    4. C#網(wǎng)絡(luò)編程系列四:自定義Web瀏覽器
    5. C#網(wǎng)絡(luò)編程系列五:TCP編程
    6. C#網(wǎng)絡(luò)編程系列六:UDP編程
    7. C#網(wǎng)絡(luò)編程系列七:UDP編程補充
    8. C#網(wǎng)絡(luò)編程系列九:類似QQ的即時通信程序
    9. C#網(wǎng)絡(luò)編程系列十:實現(xiàn)簡單的郵件收發(fā)器

 

責(zé)任編輯:張偉 來源: Learning hard的博客
相關(guān)推薦

2010-07-13 14:41:14

2012-09-24 15:35:24

C#網(wǎng)絡(luò)協(xié)議UDP

2012-09-24 15:13:50

C#網(wǎng)絡(luò)協(xié)議TCP

2012-12-10 09:46:21

P2P云存儲Symform

2015-04-27 14:29:53

C#UDP實現(xiàn)P2P語音聊天工具

2012-09-25 11:28:38

C#網(wǎng)絡(luò)協(xié)議UDP

2013-03-13 09:24:56

2010-07-07 10:31:45

2012-09-24 14:03:58

C#網(wǎng)絡(luò)協(xié)議C

2010-03-22 15:27:40

云計算

2024-08-06 14:03:35

2020-03-05 20:30:15

Syncthing文件同步工具開源

2022-07-19 16:59:04

流媒體傳輸IPC物聯(lián)網(wǎng)

2012-09-24 14:09:31

C#網(wǎng)絡(luò)協(xié)議C

2024-03-04 18:49:59

反射C#開發(fā)

2013-11-25 10:07:31

P2P對等網(wǎng)絡(luò)

2010-06-28 11:15:45

BitTorrent協(xié)

2015-04-27 11:49:23

2018-08-16 07:29:02

2013-12-12 13:46:40

大數(shù)據(jù)金融P2P大數(shù)據(jù)
點贊
收藏

51CTO技術(shù)棧公眾號