日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
淺談C#實現(xiàn)Web代理服務器的幾大步驟

代理服務程序是一種廣泛使用的網(wǎng)絡應用程序。代理程序的種類非常多,根據(jù)協(xié)議不同可以分成HTTP代理服務程序、FTP代理服務程序等,而運行代理服務程序的服務器也就相應稱為HTTP代理服務器和FTP代理服務器。本文將介紹用C#的Web代理服務程序代理的是HTTP協(xié)議。

公司主營業(yè)務:成都網(wǎng)站設計、成都網(wǎng)站建設、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出麻栗坡免費做網(wǎng)站回饋大家。

一、網(wǎng)絡代理程序的優(yōu)點

代理服務所起的是一個橋的作用,它是網(wǎng)絡信息的中轉(zhuǎn)站。在網(wǎng)絡中應用代理服務一般是基于以下幾個原因:

(1)充分利用IP地址資源。在局域網(wǎng)中,一般對外的IP地址都是非常有限的,為了保證局域網(wǎng)內(nèi)部的主機都能夠訪問互聯(lián)網(wǎng)資源,通過網(wǎng)絡代理就可以實現(xiàn)。

(2)能夠保證網(wǎng)絡安全。網(wǎng)絡代理可以充當內(nèi)部網(wǎng)和互聯(lián)網(wǎng)之間的防火墻,通過過濾IP地址,限定某些IP地址對外部資源的訪問。

(3)能夠有效地隱藏自己的IP地址和主機名。由于所有對外網(wǎng)的請求都是通過代理服務器實現(xiàn)的,所以目的主機只能知道代理服務器的IP地址。

(4)提高網(wǎng)絡速度。通常代理服務器都設有一個較大的硬盤緩沖區(qū),它存儲界數(shù)據(jù),當你再訪問相同的數(shù)據(jù)時,則可以直接從緩沖區(qū)中取出信息,從而提高訪問速度。

二、網(wǎng)絡代理的類型及實現(xiàn)原理

網(wǎng)絡代理服務根據(jù)工作層次,一般可分為應用層代理、傳輸層代理和SOCKS代理。應用層代理是工作在TCP/IP參考模型的應用層之上,它支持對應用層協(xié)議(如HTTP、FTP)的代理。它提供的控制最多,但是不靈活,必須要有相應的協(xié)議支持。如果協(xié)議不支持代理(如SMTP和POP),那就只能在應用層以下代理,也即傳輸層代理。

傳輸層代理直接與TCP層交互,更加靈活。要求代理服務器具有部分真正服務器的功能:監(jiān)聽特定TCP或UDP端口,接收客戶端的請求同時向客戶端發(fā)出相應的響應。另一種代理需要改變客戶端的IP棧,即SOCKS代理。它是可用的最強大、最靈活的代理標準協(xié)議。SOCK V4允許代理服務器內(nèi)部的客戶端完全地連接到外部的服務器,SOCK V5增加了對客戶端的授權(quán)和認證,因此它是一種安全性較高的代理。本節(jié)后面介紹的代理是一種應用層上面的代理,所代理的協(xié)議是HTTP,也就是經(jīng)常見到的Web代理服務器。

正如上面所說,網(wǎng)絡代理就是一個連接客戶端(需要代理的計算機)和服務器端(提供訪問資源的服務器)的橋。要實現(xiàn)這種橋的功能,網(wǎng)絡代理就必須滿足下列條件,其實也是代理服務的運行的流程:

(1)接收并解析客戶端的請求。

(2)創(chuàng)建到服務器的新連接,并轉(zhuǎn)發(fā)客戶端的請求信息。

(3)接收服務器反饋的信息。

(4)解釋服務器的響應并將該響應傳回給客戶端。

網(wǎng)絡代理雖然有很多優(yōu)點,但由于使用代理后,自己對網(wǎng)絡的所有請求都是通過代理服務器這個中間人來實現(xiàn)的,所以有可能碰上存有惡意的人監(jiān)聽你的輸入的內(nèi)容。同樣,如果選擇的代理服務器的帶寬比較小,使用代理還會降低網(wǎng)速。

總而言之,使用代理有利有弊,使用者要根據(jù)自身的情況來決定。但無論如何,選擇一個好的代理服務器是非常重要的。

三、C#實現(xiàn)Web代理服務器程序

經(jīng)過了上面的介紹,我想大家對代理服務應該有了一個基本的認識,下面就讓我們通過一個實例來深入體會一下如何用C#實現(xiàn)Web代理服務器。Web代理服務的功能順序是這樣的:

(1)偵聽端口,等待客戶端瀏覽器發(fā)送來的Web請求信息。

(2)接收到客戶端Web請求信息后,解析出目標Web服務器的地址,并創(chuàng)建一個Socket實例,并以此實例連接Web服務器上。

(3)通過創(chuàng)建的Socket傳送客戶端的Web請求數(shù)據(jù)包到Web服務器的80端口。

(4)接收Web服務器返回的頁面數(shù)據(jù)。

(5)把接收來的數(shù)據(jù)傳送到客戶端,從而實現(xiàn)Web代理。

客戶端對某個Web地址的瀏覽,可能要傳送很多的Web請求信息(比如網(wǎng)頁中的圖像、Flash等),為了更快更準確地處理這些信息,Web代理服務程序通常采用多線程來處理每一個Web請求。細心的讀者可能會發(fā)現(xiàn),處理每一個客戶端的Web請求信息,代理服務器軟件都要使用二個Socket,一個是用來接收/傳送客戶機的信息,一個是和Web服務器進行交流。為了區(qū)分這二個Socket,我們把和服務器對話的稱為“服務Socket”,和客戶端機器對話的稱為“客戶Socket”。

下面就開始C#實現(xiàn)Web代理服務器的編寫工作。這個實例包含三個部分內(nèi)容:

1.創(chuàng)建一個Web代理類。

2.Web代理服務的類的實例化。

3.如何通過這個Web代理類的實例實現(xiàn)Web代理服務。

(一)創(chuàng)建一個Web代理類

具體操作步驟如下:

1.啟動Visual Studio.Net,依次選擇“文件”、“新建”、“項目”菜單后,在彈出“新建項目”對話框中將“項目類型”設置為“Visual C#項目”,將“模板”設置為“Windows應用程序”,在“名稱”文本框中輸入“WebProxy”,在“位置”文本框中輸入“E:VS.NET項目”,然后單擊“確定”按鈕,這樣項目便建立好了。

2.依次選擇菜單“項目”、“添加類”,將彈出“添加新項”對話框。

3.將“模板”設置為“類”。

4.在“名稱”文本框中輸入“Proxy”,單擊“打開”按鈕

5.在“解決方案資源管理器”窗口中,雙擊Proxy.cs文件,進入Proxy.cs文件的編輯界

6.在Proxy.cs源文件的開頭,添加下列代碼,下列代碼是導入Proxy.cs中要使用到的命名空間:

 
 
 
  1. using System;  
  2. using System.Net;  
  3. using System.Net.Sockets;  
  4. using System.Text;  
  5. using System.IO; 

7.用下列構(gòu)造函數(shù)替代默認的構(gòu)造函數(shù)。下面的代碼是在Proxy類中創(chuàng)建一個構(gòu)造函數(shù)。Proxy類只有一個構(gòu)造函數(shù),并且這個構(gòu)造函數(shù)只有一個參數(shù),這個參數(shù)是Socket對象,它主要用來和客戶端進行數(shù)據(jù)交換,是一個“客戶Socket”:

 
 
 
  1. public Proxy(Socket socket)  
  2. {  
  3. //  
  4. // TODO: 在此處添加構(gòu)造函數(shù)邏輯  
  5. //  
  6. this.clientSocket = socket ;  

8.在定義Proxy類代碼區(qū)中加入下列代碼,下列代碼是定義Proxy類中的使用的一些變量,這些變量主要是在后面的定義Run方法中使用。

 
 
 
  1. Socket clientSocket;  
  2. Byte[] read = new byte[1024];  
  3. //定義一個空間,存儲來自客戶端請求數(shù)據(jù)包  
  4. Byte [] Buffer = null;  
  5. Encoding ASCII = Encoding.ASCII;  
  6. //設定編碼  
  7. Byte[] RecvBytes = new Byte[4096];  
  8. //定義一個空間,存儲Web服務器返回的數(shù)據(jù) 

9.創(chuàng)建Proxy類中的Run方法。Run方法是Proxy類中唯一的方法。其功能是從客戶端接收HTTP請求,并傳送到Web服務器,然后從Web服務器接收反饋來的數(shù)據(jù),并傳送到客戶端。為了實現(xiàn)這二個不同方面的數(shù)據(jù)傳送,Run方法中是通過兩個Socket實例來實現(xiàn)的。在編寫Run方法的時候,要注意下面兩點:

(1)由于HTTP建立于TCP協(xié)議之上,所以創(chuàng)建的Socket實例應該使用TCP協(xié)議。下面代碼是創(chuàng)建可以傳送HTTP請求命令到Web服務器和接收來自Web服務器反饋來信息的Socket實例:

 
 
 
  1. Socket IPsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

(2)另外一個Socket是在代理服務程序偵聽端口號,接收連接請求時候得到的,所以應該以此Socket為參數(shù),利用Proxy類中的構(gòu)造函數(shù)來創(chuàng)建一個Proxy實例。此Socket實現(xiàn)從客戶端接收HTTP請求信息,并傳送數(shù)據(jù)到客戶端。

Socket創(chuàng)建和使用是實現(xiàn)Web代理軟件的關(guān)鍵。在構(gòu)造函數(shù)代碼后面,輸入下列代碼:

 
 
 
  1. public void Run()  
  2. {  
  3. string clientmessage = " " ;  
  4. //存放來自客戶端的HTTP請求字符串  
  5. string URL = " " ;  
  6. //存放解析出地址請求信息  
  7. int bytes = ReadMessage(read, ref clientSocket, ref clientmessage);  
  8. if (bytes == 0)  
  9. {  
  10. return ;  
  11. }  
  12. int index1 = clientmessage.IndexOf(' ');  
  13. int index2 = clientmessage.IndexOf(' ', index1 + 1);  
  14. if ((index1 == -1) || (index2 == -1))  
  15. {  
  16. throw new IOException();  
  17. }  
  18. string part1 = clientmessage.Substring(index1 + 1, index2 - index1);  
  19. int index3 = part1.IndexOf('/', index1 + 8);  
  20. int index4 = part1.IndexOf(' ', index1 + 8);  
  21. int index5 = index4 - index3;  
  22. URL = part1.Substring(index1 + 4, (part1.Length - index5) - 8);   
  23. try  
  24. {  
  25. IPHostEntry IPHost = Dns.Resolve(URL);  
  26. Console.WriteLine("遠程主機名: " + IPHost.HostName);  
  27. string [] aliases = IPHost.Aliases;  
  28. IPAddress[] address = IPHost.AddressList;  
  29. Console.WriteLine("Web服務器IP地址:" + address[0]);  
  30. //解析出要訪問的服務器地址  
  31. IPEndPoint ipEndpoint = new IPEndPoint(address[0], 80);  
  32. Socket IPsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  
  33. //創(chuàng)建連接Web服務器端的Socket對象  
  34. IPsocket.Connect(ipEndpoint);  
  35. //Socket連Web接服務器  
  36. if (IPsocket.Connected)  
  37. Console.WriteLine("Socket 正確連接!");  
  38. string GET = clientmessage;  
  39. Byte[] ByteGet = ASCII.GetBytes(GET);  
  40. IPsocket.Send(ByteGet, ByteGet.Length, 0);  
  41. //代理訪問軟件對服務器端傳送HTTP請求命令  
  42. Int32 rBytes = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0);  
  43. //代理訪問軟件接收來自Web服務器端的反饋信息  
  44. Console.WriteLine("接收字節(jié)數(shù):" + rBytes.ToString());  
  45. String strRetPage = null;  
  46. strRetPagestrRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes);  
  47. while (rBytes > 0)  
  48. {  
  49. rBytes = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0);  
  50. strRetPagestrRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes);  
  51. }  
  52. IPsocket.Shutdown(SocketShutdown.Both);  
  53. IPsocket.Close();  
  54. SendMessage(clientSocket, strRetPage);  
  55. //代理服務軟件往客戶端傳送接收到的信息  
  56. }  
  57. catch (Exception exc2)  

  58. //接收客戶端的HTTP請求數(shù)據(jù)
    private int ReadMessage(byte [] ByteArray, ref Socket s, ref String clientmessage)
    {
    int bytes = s.Receive(ByteArray, 1024, 0);
    string messagefromclient = Encoding.ASCII.GetString(ByteArray);
    clientmessage = (String)messagefromclient;
    return bytes;
    }

    //傳送從Web服務器反饋的數(shù)據(jù)到客戶端
    private void SendMessage(Socket s, string message)
    {
    Buffer = new Byte[message.Length + 1];
    int length = ASCII.GetBytes(message, 0, message.Length, Buffer, 0);
    Console.WriteLine("傳送字節(jié)數(shù):" + length.ToString());
    s.Send(Buffer, length, 0);
    }

至此,Proxy類的定義過程就完成了。

(二)利用Proxy類,實現(xiàn)Web代理

下面是利用Proxy類實現(xiàn)Web代理程序的具體實現(xiàn)步驟,Proxy類被定義在命名空間WebProxy中:

1.在Visual Studio .Net的代碼編輯器中打開Class1.cs文件,進入Class1.cs的代碼編輯界面。

2.在Class1.cs源文件的開頭導入下列命名空間:

 
 
 
  1. using System;  
  2. using System.Net;  
  3. using System.Net.Sockets;  
  4. using System.Text;  
  5. using System.IO;  
  6. using System.Threading;  
  7. using WebProxy; 

3.在Main函數(shù)中添加下列代碼,下列代碼是利用Proxy類,來實現(xiàn)Web代理程序:

 
 
 
  1. const int port = 8000 ;  
  2. //定義端口號  
  3. TcpListener tcplistener = new TcpListener(port);  
  4. Console.WriteLine("偵聽端口號: " + port.ToString());  
  5. tcplistener.Start();  
  6. //偵聽端口號  
  7. while (true)  
  8. {  
  9. Socket socket = tcplistener.AcceptSocket();  
  10. //并獲取傳送和接收數(shù)據(jù)的Scoket實例  
  11. Proxy proxy = new Proxy(socket);  
  12. //Proxy類實例化  
  13. Thread thread = new Thread(new ThreadStart(proxy.Run));  
  14. //創(chuàng)建線程  
  15. thread.Start();  
  16. //啟動線程  

保存上面的所有步驟,這樣一個簡單Web代理程序就算是完成了。此Web代理程序偵聽的是8000端口號。

(三)測試Web代碼程序

Web代理程序要通過二臺計算機才能夠?qū)崿F(xiàn),其中的一臺計算機運行Web代理程序充當Web代理服務器,另外一臺計算機充當客戶機,通過Web代理服務器來瀏覽網(wǎng)頁。在確定Web代理軟件運行后,需要對客戶機進行進行必要的設置:

1.打開IE瀏覽器。

2.依次選擇“工具”、“Internet選項”,在彈出的“Internet選項”對話框中選擇“連接”頁面,單擊其中的“局域網(wǎng)設置”按鈕,在彈出的“局域網(wǎng)(LAN)設置”對話框,選擇“為LAN使用代理服務器(X),(這些設置不會應用于撥號和VPN連接)”多選框,并在其中的“地址”文本框中輸入代理服務器的IP地址,比如“10.138.198.213”,在“端口”文本框中輸入“8000”。

此時客戶端的設置就完成了。在確定IP地址為“10.138.198.213”的這臺計算機已經(jīng)運行上面介紹的Web代理程序后,打開客戶端的IE瀏覽器,并輸入要瀏覽的網(wǎng)址,就可以通過Web代理服務器來瀏覽網(wǎng)頁了。

四、C#實現(xiàn)Web代理服務器總結(jié)

至此一個簡單的C#實現(xiàn)Web代理服務器軟件就算基本完成了。雖然Web代理服務器的實現(xiàn)原理相對簡單,但具體實現(xiàn)還是很繁瑣的。網(wǎng)絡代理是一個內(nèi)容豐富,實現(xiàn)復雜的論題,本節(jié)介紹的代理服務軟件,無論在實現(xiàn)的協(xié)議種類,還是實現(xiàn)的功能,都只能算很小的一部分。希望各位能夠通過本文的介紹,結(jié)合其他相關(guān)的知識,創(chuàng)造出功能更強大、安全性更高,使用更穩(wěn)定的網(wǎng)絡代理服務程序來。

【編輯推薦】

  1. 在Visual Studio 2010中使用C# 4.0的動態(tài)類型
  2. C#3.0中Lambda表達式詳解
  3. 淺談C#泛型的用處
  4. 淺談C#如何實現(xiàn)多繼承
  5. C#實用基礎教程

當前標題:淺談C#實現(xiàn)Web代理服務器的幾大步驟
分享URL:http://www.5511xx.com/article/dhcocgd.html