C#網(wǎng)絡(luò)編程系列八:P2P編程
引言:前面的介紹專題中有朋友向我留言說介紹下關(guān)于P2P相關(guān)的內(nèi)容的,首先本人對(duì)于C#網(wǎng)絡(luò)編程也不是什么大牛,因?yàn)槟芰Φ年P(guān)系,也只能把自己的一些學(xué)習(xí)過程和自己的一些學(xué)習(xí)過程中的理解和大家分享下的,下面就進(jìn)入正題——P2P(Peer to Peer)編程
一、P2P的介紹
首先,現(xiàn)在大家熟知的BT、電驢、迅雷、QQ、MSN和PPlive等都是基于P2P方式實(shí)現(xiàn)的軟件,并且對(duì)等聯(lián)網(wǎng)(Peer to Peer,P2P)將是互聯(lián)網(wǎng)的發(fā)展方向,因此對(duì)于P2P技術(shù)的了解顯得非常的重要,下面就來介紹下P2P架構(gòu):
在P2P技術(shù)之前,我們所有的網(wǎng)絡(luò)應(yīng)用都采用C/S或者B/S架構(gòu)來實(shí)現(xiàn)的,然而在之前C/S架構(gòu)的應(yīng)用程序中,客戶端軟件向服務(wù)器發(fā)出請(qǐng)求,服務(wù)器然后對(duì)客戶端請(qǐng)求做出響應(yīng),在這種情況下,如果客戶端越多,此時(shí)服務(wù)器的壓力就越大。然而采用P2P技術(shù)實(shí)現(xiàn)的每臺(tái)計(jì)算機(jī)既是客戶端,也是服務(wù)器,他們的功能都是對(duì)等的。對(duì)于安裝了P2P軟件(如迅雷,QQ等)的計(jì)算機(jī)加入一個(gè)共同的P2P網(wǎng)絡(luò),網(wǎng)絡(luò)中的節(jié)點(diǎn)之間可以直接進(jìn)行數(shù)據(jù)傳輸和通信。
1.1 P2P架構(gòu)和C/S架構(gòu)的比較
C/S架構(gòu)有下面的缺點(diǎn)(其實(shí)上面的簡(jiǎn)單介紹中也講到過):
1. 服務(wù)器負(fù)擔(dān)過重。當(dāng)大量用戶訪問C/S系統(tǒng)的服務(wù)器時(shí),服務(wù)器常常會(huì)出現(xiàn)網(wǎng)絡(luò)堵塞等現(xiàn)象,這時(shí)候,我們可能會(huì)通過增加投資提高服務(wù)器的硬件性能
2. 系統(tǒng)穩(wěn)健性和服務(wù)器關(guān)聯(lián)密切。指的是——如果服務(wù)器出現(xiàn)了問題時(shí),整個(gè)系統(tǒng)的運(yùn)行將會(huì)癱瘓(感覺是面向?qū)ο笾薪?jīng)常強(qiáng)調(diào)的原則——低耦合原則)
然而P2P具有下面的特點(diǎn):
1.對(duì)等模式
P2P系統(tǒng)中的客戶端能夠同時(shí)扮演客戶端和服務(wù)器的角色,使兩臺(tái)計(jì)算機(jī)之間能夠不通過服務(wù)器直接進(jìn)行信息分享(QQ中當(dāng)好友在線的時(shí)候發(fā)信息時(shí),相信此時(shí)是不需要經(jīng)過服務(wù)器轉(zhuǎn)發(fā)的,只有當(dāng)給離線好友發(fā)送消息時(shí),此時(shí)應(yīng)該會(huì)先把消息發(fā)送到服務(wù)器端存儲(chǔ)起來,當(dāng)好友再次登錄的時(shí)候,會(huì)和服務(wù)器進(jìn)行連接,服務(wù)器會(huì)進(jìn)行判斷是不是給這個(gè)用戶的信息來決定是否轉(zhuǎn)發(fā),QQ軟件的實(shí)現(xiàn)屬于混合型P2P結(jié)構(gòu)的, 這個(gè)會(huì)在后面的P2P系統(tǒng)分類中介紹。)
注:括號(hào)中都是我個(gè)人的一些理解,如果有什么說錯(cuò)的地方請(qǐng)大家及時(shí)更正我,這樣我會(huì)及時(shí)的更新以免誤導(dǎo)大家,謝謝大家監(jiān)督。
2. 網(wǎng)絡(luò)資源的分布式存儲(chǔ)
在C/S架構(gòu)中,所有客戶端都直接從服務(wù)器下載所有數(shù)據(jù)資源,這樣勢(shì)必會(huì)加重服務(wù)器的負(fù)擔(dān),而P2P則改變了以服務(wù)器為中心的狀態(tài),使每個(gè)節(jié)點(diǎn)可以先從服務(wù)器上個(gè)下載一部分,然后再相互從對(duì)方或者其他節(jié)點(diǎn)下載其余部分。采用這種方式,當(dāng)大量客戶端同時(shí)下載時(shí),就不會(huì)形成網(wǎng)絡(luò)堵塞現(xiàn)象了。
1.2 P2P系統(tǒng)的分類
使用P2P技術(shù)的系統(tǒng)分為兩類:
(1)單純型P2P——沒有專用的服務(wù)器。安裝了P2P軟件的各個(gè)計(jì)算機(jī)可以直接通信
(2)混合型P2P——有專用的服務(wù)器,此時(shí)的服務(wù)器一般叫索引服務(wù)器,此服務(wù)器與C/S架構(gòu)下的服務(wù)器不同,在C/S架構(gòu)下所有資源都存儲(chǔ)在服務(wù)器中,所有傳遞的信息都要經(jīng)過服務(wù)器,而在混合型P2P系統(tǒng)中的索引服務(wù)器僅僅起到協(xié)調(diào)和擴(kuò)展的功能,資源不是全部存儲(chǔ)在服務(wù)器上,而是分布在各個(gè)電腦上,安裝了P2P軟件的電腦開始全部和索引服務(wù)器連接,以便告知自己監(jiān)聽的IP地址和端口號(hào),然后再通過索引服務(wù)器告訴其他與自己連接的電腦,每臺(tái)計(jì)算機(jī)的連接和斷開都通過服務(wù)器通知網(wǎng)絡(luò)上有聯(lián)系的計(jì)算機(jī),這樣就減輕了每臺(tái)計(jì)算機(jī)搜索其他計(jì)算機(jī)的負(fù)擔(dān),但是信息的傳遞還是通過點(diǎn)對(duì)點(diǎn)的方式來完成(這里可以以QQ為例,當(dāng)我們電腦上安裝了QQ這類P2P軟件時(shí),安裝了QQ這類軟件的計(jì)算機(jī)就會(huì)加入一個(gè)P2P網(wǎng)絡(luò),并且登陸的時(shí)候都會(huì)與索引服務(wù)器建立連接,通過連接來告訴服務(wù)器自己的IP地址和端口號(hào),當(dāng)我們找一個(gè)好友聊天時(shí),此時(shí)自己的計(jì)算機(jī)和好友的計(jì)算機(jī)都會(huì)與服務(wù)器端口連接,但是要互相發(fā)送消息,自己的計(jì)算機(jī)必須知道好友計(jì)算機(jī)的IP地址和端口號(hào)才可以通信,這樣的工作正是通過索引服務(wù)器來告知對(duì)方的--指的是告訴自己的計(jì)算機(jī)好友的計(jì)算機(jī)的IP地址和端口號(hào),告訴好友的計(jì)算機(jī)自己的IP地址和端口號(hào),這樣雙方就可以不通過服務(wù)器直接通信了。)
1.3 主流P2P應(yīng)用分類
P2P 網(wǎng)絡(luò)應(yīng)用大致可以分為三類
1. 文件共享類,例如迅雷,BT等軟件都是文件共享類的應(yīng)用
2. 即時(shí)通信類,例如QQ,MSN等軟件都是屬于即時(shí)通信類
3. 多媒體傳輸類,例如在線視頻直播軟件,PPlive等軟件
從上面的分類可以看出,現(xiàn)在網(wǎng)絡(luò)上流行的軟件都采用了P2P技術(shù)來實(shí)現(xiàn)的, 但是它們的實(shí)現(xiàn)肯定不是單純的只采用P2P技術(shù)來實(shí)現(xiàn)的, 而是采用多種技術(shù)來實(shí)現(xiàn)的, 在下一專題中將介紹利用TCP,UDP和P2P等技術(shù)來實(shí)現(xiàn)類似QQ的一個(gè)即時(shí)通信程序,希望通過此程序可以綜合前面專題介紹的內(nèi)容以及幫助大家對(duì)QQ等軟件的實(shí)現(xiàn)原理有了解。
二、P2P的基本原理
在前面我們對(duì)P2P的一些知識(shí)進(jìn)行的簡(jiǎn)單的介紹, 通過前面的介紹相信大家對(duì)P2P的技術(shù)有了一定的了解,但是要自己開發(fā)一個(gè)P2P的應(yīng)用當(dāng)然必須了解P2P技術(shù)的實(shí)現(xiàn)原理的,下面就介紹下P2P實(shí)施的基本原理。
安裝了P2P軟件后,首先雙方要進(jìn)行通信,必須能夠發(fā)現(xiàn)對(duì)方(指的就是知道對(duì)方的IP地址和端口號(hào)),一旦發(fā)現(xiàn)了對(duì)方后才可以進(jìn)行通信,所以P2P應(yīng)用程序一般分為發(fā)現(xiàn)、連接和通信3個(gè)階段。 發(fā)現(xiàn)階段負(fù)責(zé)動(dòng)態(tài)定位通信方的網(wǎng)絡(luò)位置;連接階段負(fù)責(zé)在雙方建立網(wǎng)絡(luò)連接,通信階段負(fù)責(zé)在雙方之間傳輸數(shù)據(jù)。
2.1 發(fā)現(xiàn)階段
一臺(tái)計(jì)算機(jī)要和另外一臺(tái)計(jì)算機(jī)通信,必須知道對(duì)方的IP地址和監(jiān)聽端口,否則就無法向?qū)Ψ桨l(fā)送消息。在之前的C/S架構(gòu)中,服務(wù)器的IP地址一般固定不變的,并且提供服務(wù)的計(jì)算機(jī)域名也一般不會(huì)改變,所以為了方便客戶端訪問,一些Web服務(wù)器在DNS(DNS其實(shí)就是域名和IP地址的一個(gè)映射)中進(jìn)行了注冊(cè),客戶機(jī)可以利用域名解析機(jī)制將服務(wù)器域名解析為IP地址,然后在P2P應(yīng)用中,各個(gè)對(duì)等節(jié)點(diǎn)(計(jì)算機(jī)或資源)可以隨時(shí)加入和隨時(shí)離開,并且對(duì)等節(jié)點(diǎn)的IP地址也不是固定的,所以不能采用DNS的機(jī)制來獲取P2P架構(gòu)中的對(duì)等節(jié)點(diǎn)的信息。
目前,在單純型P2P中,針對(duì)如何發(fā)現(xiàn)對(duì)等節(jié)點(diǎn),各種P2P技術(shù)采用的協(xié)議和標(biāo)準(zhǔn)都不一樣,微軟在.net 支持對(duì)等名稱解析協(xié)議(Peer name Resolution Protocol, PNRP),該協(xié)議可以發(fā)現(xiàn)對(duì)等節(jié)點(diǎn)的信息,通過無服務(wù)器的解析功能將任何資源解析為一組IP地址和端口號(hào),在后面的實(shí)現(xiàn)的簡(jiǎn)單程序用的就是這個(gè)協(xié)議來完成發(fā)現(xiàn)階段的。
2.2 連接和通信階段
完成對(duì)等節(jié)點(diǎn)的發(fā)現(xiàn)后,接下來就可以根據(jù)需要,選擇TCP、UDP或者其他協(xié)議完成數(shù)據(jù)傳輸。如果選擇TCP,則需要先建立連接,再利用該連接傳輸數(shù)據(jù),關(guān)于TCP的內(nèi)容可以查看我之前的專題;如果選擇UDP,則無須建立連接,直接在對(duì)等節(jié)點(diǎn)之間通信就可以了。
三、.net平臺(tái)對(duì)P2P編程的支持
之前在發(fā)現(xiàn)階段也介紹了.Net平臺(tái)對(duì)P2P編程的支持的,然后微軟幫我們已經(jīng)封裝好了對(duì)PNRP協(xié)議的實(shí)現(xiàn),這些類在System.Net.PeerToPeer命名空間里(微軟現(xiàn)在很多東西都幫我們封裝了,這樣可以方便我們開發(fā)應(yīng)用程序,感覺微軟的做的東西都是這樣,把程序的實(shí)現(xiàn)都幫我們做好了,我們開發(fā)程序的時(shí)候只要關(guān)注業(yè)務(wù)邏輯就好了的, 這樣做當(dāng)然有好處也有壞處的, 我覺得好處就是縮短軟件的開發(fā)周期,讓花更多的時(shí)間去實(shí)現(xiàn)軟件真真的業(yè)務(wù)邏輯方面的東西,不好的地方就是現(xiàn)在的程序員就不能叫程序員,所以園子里面有很多人都稱碼農(nóng),這些我自己的觀點(diǎn)了)
3.1 對(duì)等名稱解析協(xié)議(PNRP)
PNRP可以完成對(duì)等名稱的注冊(cè)和解析(可以和DNS對(duì)比來理解)。
3.1.1 基本概念
第一個(gè)介紹的是對(duì)等名稱的概念,我們將每一個(gè)網(wǎng)絡(luò)資源(包括計(jì)算機(jī),P2P應(yīng)用程序、視頻、Mp3或其他文檔等資源)抽象為對(duì)等節(jié)點(diǎn),對(duì)等節(jié)點(diǎn)名稱當(dāng)然就是對(duì)等節(jié)點(diǎn)的名稱。對(duì)等節(jié)點(diǎn)名稱簡(jiǎn)稱為對(duì)等名,分為安全的和不安全的兩種形式,不安全的名稱僅由文本字符串組成,任何人都可以注冊(cè)一個(gè)相同的不安全對(duì)等名稱;安全的由一個(gè)公鑰/私鑰(代表唯一)對(duì)支持,所以使用PNRP注冊(cè)時(shí),不會(huì)受到欺騙,對(duì)等名稱的格式如下:
Authority.Classifier
Authority的值取決于該名稱的安全類型。對(duì)于不安全的類型,Authority為單字符“0”,而對(duì)于安全的對(duì)等名稱,Authority由40個(gè)十六機(jī)制字符組成
Classifier是用戶定義的用于標(biāo)志對(duì)等節(jié)點(diǎn)的字符串,最大長(zhǎng)度為150個(gè)Unicode字符。例如,對(duì)等名稱0.PeerNametest1就是一個(gè)不安全的對(duì)等名稱。
第二個(gè)概念就是云(Cloud)的概念,安裝了相同P2P軟件的計(jì)算機(jī)會(huì)加入一個(gè)共同的P2P網(wǎng)絡(luò)中,才能相互識(shí)別各自擁有的資源并順利進(jìn)行P2P通信。微軟PNPR協(xié)議將這個(gè)P2P網(wǎng)絡(luò)稱為“云”。云是指一組可以通過P2P網(wǎng)絡(luò)相互識(shí)別的對(duì)等節(jié)點(diǎn)及其上資源的集合。云中的所有對(duì)等節(jié)點(diǎn)都可以解析注冊(cè)到該云中的其他任何資源所在的位置(IP+Port),一個(gè)對(duì)等節(jié)點(diǎn)上的某個(gè)資源可以同時(shí)注冊(cè)到多個(gè)云中。
PNPR目前使用了兩種云——本地云和全局云。一個(gè)對(duì)等名稱若注冊(cè)到鏈接一本地云,就意味著只有同一本地網(wǎng)絡(luò)上的其他對(duì)等節(jié)點(diǎn)可以解析該名稱。而注冊(cè)到全局云上的對(duì)等名稱則允許IPv6互聯(lián)網(wǎng)的任何對(duì)等節(jié)點(diǎn)解析。
注:全局云是基于IPv6協(xié)議的,并不支持IPv4,如果不存在IPv6地址,則不會(huì)出現(xiàn)全局云,也無法加入全局云。由于現(xiàn)在網(wǎng)上絕大多數(shù)應(yīng)用使用的仍然是IPv4的地址,所以我們通常的P2P編程還用不到全局云,而只能使用默認(rèn)的本地云。
3.1.2 名稱注冊(cè)
任何資源要被網(wǎng)絡(luò)上的其他計(jì)算機(jī)識(shí)別到,首先必須注冊(cè)進(jìn)P2P網(wǎng)絡(luò),名稱注冊(cè)就是將包含對(duì)等節(jié)點(diǎn)信息的對(duì)等名稱發(fā)布到云中,以便其他對(duì)等節(jié)點(diǎn)解析。一個(gè)資源如果注冊(cè)到云中后,就可以被云中的其他對(duì)等節(jié)點(diǎn)解析和訪問。
關(guān)于名稱注冊(cè)的具體內(nèi)容,在后面的P2P的程序中也會(huì)使用的, 相信大家可以通過代碼來進(jìn)一步理解名稱的注冊(cè),這里就先介紹到這里的
3.1.3 名稱解析
名稱解析是指利用對(duì)等名稱獲取到云中資源所在對(duì)等節(jié)點(diǎn)的IP地址和端口號(hào)的過程(和DNS解析原理一樣)。PNPR名稱解析僅能夠注冊(cè)到云中的其他對(duì)等節(jié)點(diǎn)資源,而不能發(fā)現(xiàn)自身注冊(cè)的資源
PNPR協(xié)議沒有使用索引服務(wù)器,所以為了完成解析,云中的每個(gè)對(duì)等節(jié)點(diǎn)都存儲(chǔ)一些PNRP ID的緩存記錄。PNPR緩存中的都含有PNPR ID和應(yīng)用程序的IP地址和端口號(hào)。名稱解析的步驟為——首先在本地計(jì)算機(jī)對(duì)等節(jié)點(diǎn)的緩存中查找目標(biāo)資源,如果沒有,則在緩存中的臨近節(jié)點(diǎn)查看,這樣循環(huán)下去,直到找到目標(biāo)資源所在的對(duì)等節(jié)點(diǎn)位置。
3.2 PeerToPeer命名空間
上面主要介紹了PNPR協(xié)議的工作過程(相當(dāng)于是理論部分了),下面就介紹下.net 為我們封裝好PNPR的類的使用。這里就簡(jiǎn)單指明幾個(gè)常用類的使用,并附上MSDN的鏈接,大家可以直接點(diǎn)鏈接進(jìn)行查看詳細(xì)內(nèi)容,因?yàn)楹竺娴腜2P程序中也有具體的使用,所以這里就不一一列出來了。
這些類基本上從類名都可以大致知道他們的用途的,所以在這里就沒有一一介紹的,只是附上了MSDN的鏈接。
四、實(shí)現(xiàn)P2P應(yīng)用程序
以上介紹了那么多P2P的相關(guān)的知識(shí),主要是為了實(shí)現(xiàn)一個(gè)自定義的P2P應(yīng)用程序做準(zhǔn)備的,這里就簡(jiǎn)單實(shí)現(xiàn)了資源發(fā)現(xiàn)的一個(gè)程序。
核心代碼:
對(duì)等名稱的注冊(cè)代碼:
- // 注冊(cè)資源
- private void btnRegister_Click(object sender, EventArgs e)
- {
- if (tbxResourceName.Text == "")
- {
- MessageBox.Show("請(qǐng)輸入發(fā)布的資源名!", "提示");
- return;
- }
- // 將資源名注冊(cè)到云中
- // 具體資源名的結(jié)構(gòu)在博客有介紹
- PeerName resourceName = new PeerName(tbxResourceName.Text, PeerNameType.Unsecured);
- // 用指定的名稱和端口號(hào)初始化PeerNameRegistration類的實(shí)例
- resourceNameReg[seedCount] = new PeerNameRegistration(resourceName, int.Parse(tbxlocalport.Text));
- // 設(shè)置在云中注冊(cè)的對(duì)等名對(duì)象的其他信息的注釋
- resourceNameReg[seedCount].Comment =resourceName.ToString();
- // 設(shè)置PeerNameRegistration對(duì)象的應(yīng)用程序定義的二進(jìn)制數(shù)據(jù)
- resourceNameReg[seedCount].Data = Encoding.UTF8.GetBytes(string.Format("{0}", DateTime.Now.ToString()));
- // 在云中注冊(cè)PeerName(對(duì)等名)
- resourceNameReg[seedCount].Start();
- seedCount++;
- comboxSharelist.Items.Add(resourceName.ToString());
- tbxResourceName.Text = "";
- }
名稱解析代碼(搜索資源):
- // 搜索資源
- private void btnSearch_Click(object sender, EventArgs e)
- {
- if (tbxSeed.Text == "")
- {
- MessageBox.Show("請(qǐng)先輸入要尋找的種子資源名", "提示");
- return;
- }
- lstViewOnlinePeer.Items.Clear();
- // 初始化要搜索的資源名
- PeerName searchSeed = new PeerName("0." + tbxSeed.Text);
- // PeerNameResolver類是將節(jié)點(diǎn)名解析為PeerNameRecord的值(即將通過資源名來查找資源名所在的地址,包括IP地址和端口號(hào))
- // PeerNameRecord用來定于云中的各個(gè)節(jié)點(diǎn)
- PeerNameResolver myresolver = new PeerNameResolver();
- // PeerNameRecordCollection表示PeerNameRecord元素的容器
- // Resolve方法是同步的完成解析
- // 使用同步方法可能會(huì)出現(xiàn)界面“假死”現(xiàn)象
- // 解決界面假死現(xiàn)象可以采用多線程或異步的方式
- // 關(guān)于多線程的知識(shí)可以參考本人博客中多線程系列我前面UDP編程中有所使用
- // 在這里就不列出多線程的使用了,朋友可以自己實(shí)現(xiàn),如果有問題可以留言給我一起討論
- PeerNameRecordCollection recordCollection = myresolver.Resolve(searchSeed);
- foreach (PeerNameRecord record in recordCollection)
- {
- foreach(IPEndPoint endpoint in record.EndPointCollection)
- {
- if (endpoint.AddressFamily.Equals(AddressFamily.InterNetwork))
- {
- ListViewItem item = new ListViewItem();
- item.SubItems.Add(endpoint.ToString());
- item.SubItems.Add(Encoding.UTF8.GetString(record.Data));
- lstViewOnlinePeer.Items.Add(item);
- }
- }
- }
- }
運(yùn)行結(jié)果截圖:
為了演示資源發(fā)現(xiàn)的效果,所以同時(shí)開啟了本程序的3個(gè)進(jìn)程來模擬網(wǎng)絡(luò)上對(duì)等的3個(gè)計(jì)算機(jī)節(jié)點(diǎn),當(dāng)在資源名中輸入資源后會(huì)在分享下列表中顯示出本地分享的資源,同時(shí)在P2P網(wǎng)絡(luò)上的其他計(jì)算機(jī)可以通過資源名稱搜索該資源,將得到的資源名稱和發(fā)布時(shí)間顯示在ListView控件中,下面是程序的運(yùn)行結(jié)果:
五、總結(jié)
到這里P2P編程的介紹就結(jié)束了, 本專題只是簡(jiǎn)單演示了一個(gè)資源發(fā)現(xiàn)的程序,資源發(fā)現(xiàn)是P2P的核心技術(shù),正是因?yàn)镻2P技術(shù)實(shí)現(xiàn)了互聯(lián)網(wǎng)范圍的資源發(fā)現(xiàn),才使得它被廣泛應(yīng)用,像我們經(jīng)常用的下載工具——迅雷,迅雷就是典型采用P2P技術(shù)的應(yīng)用程序,當(dāng)我們?cè)谘咐醉?yè)面中輸入“愛情公寓3”(相當(dāng)于本專題中種子文本框填的資源名)然后點(diǎn)擊搜索后迅雷會(huì)自動(dòng)啟動(dòng)“狗狗搜索”并顯示資源鏈接列表,當(dāng)我們點(diǎn)擊連接就可以進(jìn)行下載了。不過迅雷肯定不是使用微軟的PNPR,而是迅雷自主研發(fā)的與PNPR作用一樣的協(xié)議——都是完成解析網(wǎng)絡(luò)資源的地址的作用,當(dāng)然,迅雷軟件中也采用了其他的一些技術(shù),如搜索引擎等。
希望本專題可以幫助大家對(duì)P2P技術(shù)有所了解,如果有任何的問題都可以通過留言的方式來一起討論,在下一個(gè)專題中將介紹實(shí)現(xiàn)一個(gè)類似QQ的程序。
源碼附上:http://files.cnblogs.com/zhili/P2PResourceDiscovery.zip ,希望覺得有幫助的朋友可以推薦下。謝謝支持
原文鏈接:http://www.cnblogs.com/zhili/archive/2012/09/14/P2P_PNPR.html
【編輯推薦】
- C#網(wǎng)絡(luò)編程系列一:網(wǎng)絡(luò)協(xié)議簡(jiǎn)介
- C#網(wǎng)絡(luò)編程系列二:HTTP協(xié)議詳解
- C#網(wǎng)絡(luò)編程系列三:自定義Web服務(wù)器
- C#網(wǎng)絡(luò)編程系列四:自定義Web瀏覽器
- C#網(wǎng)絡(luò)編程系列五:TCP編程
- C#網(wǎng)絡(luò)編程系列六:UDP編程
- C#網(wǎng)絡(luò)編程系列七:UDP編程補(bǔ)充
- C#網(wǎng)絡(luò)編程系列九:類似QQ的即時(shí)通信程序
- C#網(wǎng)絡(luò)編程系列十:實(shí)現(xiàn)簡(jiǎn)單的郵件收發(fā)器