淺談C#實現WebProxy 伺服器的幾大步驟

來源:互聯網
上載者:User

標籤:簡單   模板   步驟   httpProxy 伺服器   添加   cep   tostring   安全性   接收   

 代理服務程式是一種廣泛使用的網路應用程式。代理程式的種類非常多,根據協議不同可以分成HTTP代理服務程式、FTP代理服務程式等,而運行代理服務程式的伺服器也就相應稱為HTTPProxy 伺服器和FTPProxy 伺服器。本文將介紹用C#的Web代理服務程式代理的是HTTP協議。

  一、網路代理程式程式的優點

  代理服務所起的是一個橋的作用,它是網路資訊的中轉站。在網路中應用代理服務一般是基於以下幾個原因:

  (1)充分利用IP地址資源。在區域網路中,一般對外的IP地址都是非常有限的,為了保證區域網路內部的主機都能夠訪問互連網資源,通過網路代理程式就可以實現。

  (2)能夠保證網路安全。網路代理程式可以充當內部網和互連網之間的防火牆,通過過濾IP地址,限定某些IP地址對外部資源的訪問。

  (3)能夠有效地隱藏自己的IP地址和主機名稱。由於所有對外網的請求都是通過Proxy 伺服器實現的,所以目的主機只能知道Proxy 伺服器的IP地址。

  (4)提高網路速度。通常Proxy 伺服器都設有一個較大的硬碟緩衝區,它儲存界資料,當你再訪問相同的資料時,則可以直接從緩衝區中取出資訊,從而提高訪問速度。

  二、網路代理程式的類型及實現原理

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

  傳輸層代理直接與TCP層互動,更加靈活。要求Proxy 伺服器具有部分真正伺服器的功能:監聽特定TCP或UDP連接埠,接收用戶端的請求同時向用戶端發出相應的響應。另一種代理需要改變用戶端的IP棧,即SOCKS代理。它是可用的最強大、最靈活的代理標準協議。SOCK V4允許Proxy 伺服器內部的用戶端完全地串連到外部的伺服器,SOCK V5增加了對用戶端的授權和認證,因此它是一種安全性較高的代理。本節後面介紹的代理是一種應用程式層上面的代理,所代理的協議是HTTP,也就是經常見到的WebProxy 伺服器。

  正如上面所說,網路代理程式就是一個串連用戶端(需要代理的電腦)和伺服器端(提供訪問資源的伺服器)的橋。要實現這種橋的功能,網路代理程式就必須滿足下列條件,其實也是代理服務的啟動並執行流程:

  (1)接收並解析用戶端的請求。

  (2)建立到伺服器的新串連,並轉寄用戶端的請求資訊。

  (3)接收伺服器反饋的資訊。

  (4)解釋伺服器的響應並將該響應傳回給用戶端。

  網路代理程式雖然有很多優點,但由於使用代理後,自己對網路的所有請求都是通過Proxy 伺服器這個中間人來實現的,所以有可能碰上存有惡意的人監聽你的輸入的內容。同樣,如果選擇的Proxy 伺服器的頻寬比較小,使用代理還會降低網速。

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

  三、C#實現WebProxy 伺服器程式

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

  (1)偵聽連接埠,等待用戶端瀏覽器發送來的Web請求資訊。

  (2)接收到用戶端Web請求資訊後,解析出目標Web伺服器的地址,並建立一個Socket執行個體,並以此執行個體串連Web伺服器上。

  (3)通過建立的Socket傳送用戶端的Web請求資料包到Web伺服器的80連接埠。

  (4)接收Web伺服器返回的頁面資料。

  (5)把接收來的資料傳送到用戶端,從而實現Web代理。

  用戶端對某個Web地址的瀏覽,可能要傳送很多的Web請求資訊(比如網頁中的映像、Flash等),為了更快更準確地處理這些資訊,Web代理服務程式通常採用多線程來處理每一個Web請求。細心的讀者可能會發現,處理每一個用戶端的Web請求資訊,Proxy 伺服器軟體都要使用二個Socket,一個是用來接收/傳送客戶機的資訊,一個是和Web伺服器進行交流。為了區分這二個Socket,我們把和伺服器對話的稱為“服務Socket”,和用戶端機器對話的稱為“客戶Socket”。

  下面就開始C#實現WebProxy 伺服器的編寫工作。這個執行個體包含三個部分內容:

  1.建立一個Web代理類。

  2.Web代理服務的類的執行個體化。

  3.如何通過這個Web代理類的執行個體實現Web代理服務。

  (一)建立一個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中要使用到的命名空間:


  
  using System;  
  using System.Net;  
  using System.Net.Sockets;  
  using System.Text;  
  using System.IO; 

  7.用下列建構函式替代預設的建構函式。下面的代碼是在Proxy類中建立一個建構函式。Proxy類只有一個建構函式,並且這個建構函式只有一個參數,這個參數是Socket對象,它主要用來和用戶端進行資料交換,是一個“客戶Socket”:


  
  public Proxy(Socket socket)  
  {  
  //  
  // TODO: 在此處添加建構函式邏輯  
  //  
  this.clientSocket = socket ;  
  } 

  8.在定義Proxy類代碼區中加入下列代碼,下列代碼是定義Proxy類中的使用的一些變數,這些變數主要是在後面的定義Run方法中使用。


  
  Socket clientSocket;  
  Byte[] read = new byte[1024];  
  //定義一個空間,儲存來自用戶端請求資料包  
  Byte [] Buffer = null;  
  Encoding ASCII = Encoding.ASCII;  
  //設定編碼  
  Byte[] RecvBytes = new Byte[4096];  
  //定義一個空間,儲存Web伺服器返回的資料 

  9.建立Proxy類中的Run方法。Run方法是Proxy類中唯一的方法。其功能是從用戶端接收HTTP請求,並傳送到Web伺服器,然後從Web伺服器接收反饋來的資料,並傳送到用戶端。為了實現這二個不同方面的資料傳送,Run方法中是通過兩個Socket執行個體來實現的。在編寫Run方法的時候,要注意下面兩點:

  (1)由於HTTP建立於TCP協議之上,所以建立的Socket執行個體應該使用TCP協議。下面代碼是建立可以傳送HTTP請求命令到Web伺服器和接收來自Web伺服器反饋來資訊的Socket執行個體:


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

  (2)另外一個Socket是在代理服務程式偵聽連接埠號碼,接收串連請求時候得到的,所以應該以此Socket為參數,利用Proxy類中的建構函式來建立一個Proxy執行個體。此Socket實現從用戶端接收HTTP請求資訊,並傳送資料到用戶端。

  Socket建立和使用是實現Web代理軟體的關鍵。在建構函式代碼後面,輸入下列代碼:
  


  
  public void Run()  
  {  
  string clientmessage = " " ;  
  //存放來自用戶端的HTTP請求字串  
  string URL = " " ;  
  //存放解析出地址請求資訊  
  int bytes = ReadMessage(read, ref clientSocket, ref clientmessage);  
  if (bytes == 0)  
  {  
  return ;  
  }  
  int index1 = clientmessage.IndexOf(‘ ‘);  
  int index2 = clientmessage.IndexOf(‘ ‘, index1 + 1);  
  if ((index1 == -1) || (index2 == -1))  
  {  
  throw new IOException();  
  }  
  string part1 = clientmessage.Substring(index1 + 1, index2 - index1);  
  int index3 = part1.IndexOf(‘/‘, index1 + 8);  
  int index4 = part1.IndexOf(‘ ‘, index1 + 8);  
  int index5 = index4 - index3;  
  URL = part1.Substring(index1 + 4, (part1.Length - index5) - 8);   
  try  
  {  
  IPHostEntry IPHost = Dns.Resolve(URL);  
  Console.WriteLine("遠程主機名稱: " + IPHost.HostName);  
  string [] aliases = IPHost.Aliases;  
  IPAddress[] address = IPHost.AddressList;  
  Console.WriteLine("Web伺服器IP地址:" + address[0]);  
  //解析出要訪問的伺服器位址  
  IPEndPoint ipEndpoint = new IPEndPoint(address[0], 80);  
  Socket IPsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  
  //建立串連Web伺服器端的Socket對象  
  IPsocket.Connect(ipEndpoint);  
  //Socket連Web接伺服器  
  if (IPsocket.Connected)  
  Console.WriteLine("Socket 正確串連!");  
  string GET = clientmessage;  
  Byte[] ByteGet = ASCII.GetBytes(GET);  
  IPsocket.Send(ByteGet, ByteGet.Length, 0);  
  //代理訪問軟體對伺服器端傳送HTTP請求命令  
  Int32 rBytes = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0);  
  //代理訪問軟體接收來自Web伺服器端的反饋資訊  
  Console.WriteLine("接收位元組數:" + rBytes.ToString());  
  String strRetPage = null;  
  strRetPagestrRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes);  
  while (rBytes > 0)  
  {  
  rBytes = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0);  
  strRetPagestrRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes);  
  }  
  IPsocket.Shutdown(SocketShutdown.Both);  
  IPsocket.Close();  
  SendMessage(clientSocket, strRetPage);  
  //代理服務軟體往用戶端傳送接收到的資訊  
  }  
  catch (Exception exc2)  
  } 
  //接收用戶端的HTTP請求資料
  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伺服器反饋的資料到用戶端
  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("傳送位元組數:" + length.ToString());
  s.Send(Buffer, length, 0);
  }

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

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

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

  1.在Visual Studio .Net的代碼編輯器中開啟Class1.cs檔案,進入Class1.cs的代碼編輯介面。

  2.在Class1.cs源檔案的開頭匯入下列命名空間:


  
  using System;  
  using System.Net;  
  using System.Net.Sockets;  
  using System.Text;  
  using System.IO;  
  using System.Threading;  
  using WebProxy; 

  3.在Main函數中添加下列代碼,下列代碼是利用Proxy類,來實現Web代理程式:


  
  const int port = 8000 ;  
  //定義連接埠號碼  
  TcpListener tcplistener = new TcpListener(port);  
  Console.WriteLine("偵聽連接埠號碼: " + port.ToString());  
  tcplistener.Start();  
  //偵聽連接埠號碼  
  while (true)  
  {  
  Socket socket = tcplistener.AcceptSocket();  
  //並擷取傳送和接收資料的Scoket執行個體  
  Proxy proxy = new Proxy(socket);  
  //Proxy類執行個體化  
  Thread thread = new Thread(new ThreadStart(proxy.Run));  
  //建立線程  
  thread.Start();  
  //啟動線程  
  } 

  儲存上面的所有步驟,這樣一個簡單Web代理程式就算是完成了。此Web代理程式偵聽的是8000連接埠號碼。

  (三)測試Web代碼程式

  Web代理程式要通過二台電腦才能夠實現,其中的一台電腦運行Web代理程式充當WebProxy 伺服器,另外一台電腦充當客戶機,通過WebProxy 伺服器來瀏覽網頁。在確定Web代理軟體運行後,需要對客戶機進行進行必要的設定:

  1.開啟IE瀏覽器。

  2.依次選擇“工具”、“Internet選項”,在彈出的“Internet選項”對話方塊中選擇“串連”頁面,單擊其中的“區域網路設定”按鈕,在彈出的“區域網路(LAN)設定”對話方塊,選擇“為LAN使用Proxy 伺服器(X),(這些設定不會應用於撥號和VPN串連)”多選框,並在其中的“地址”文字框中輸入Proxy 伺服器的IP地址,比如“10.138.198.213”,在“連接埠”文字框中輸入“8000”。

  此時用戶端的設定就完成了。在確定IP地址為“10.138.198.213”的這台電腦已經運行上面介紹的Web代理程式後,開啟用戶端的IE瀏覽器,並輸入要瀏覽的網址,就可以通過WebProxy 伺服器來瀏覽網頁了。

  四、C#實現WebProxy 伺服器總結

  至此一個簡單的C#實現WebProxy 伺服器軟體就算基本完成了。雖然WebProxy 伺服器的實現原理相對簡單,但具體實現還是很繁瑣的。網路代理程式是一個內容豐富,實現複雜的論題,本節介紹的代理服務軟體,無論在實現的協議種類,還是實現的功能,都只能算很小的一部分。希望各位能夠通過本文的介紹,結合其他相關的知識,創造出功能更強大、安全性更高,使用更穩定的網路代理程式服務程式來。

淺談C#實現WebProxy 伺服器的幾大步驟

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.