Visual C#實現HTTP代理服務程式

來源:互聯網
上載者:User
  網路代理程式程式的種類非常多,根據代理服務程式代理的協議不同,分成HTTP代理服務程式、FTP代理服務程式等,運行代理服務程式的伺服器也就稱為HTTPProxy 伺服器和FTPProxy 伺服器。在本節中介紹的Web代理服務程式代理的就是HTTP協議。

  一.網路代理程式的類型及實現原理:

  網路代理程式服務根據工作層次,一般可分為應用程式層代理、傳輸層代理和SOCKS代理。應用程式層代理是工作在TCP/IP參考模型的應用程式層之上,它支援對應用程式層協議(如HTTP,FTP)的代理。它提供的控制最多,但是不靈活,必須要有相應的協議支援。如果協議不支援代理(如SMTP和POP),那就只能在應用程式層以下代理,也即傳輸層代理。傳輸層代理直接與TCP層互動,更加靈活。要求Proxy 伺服器具有部分真正伺服器的功能:監聽特定TCP或UDP連接埠,接收用戶端的請求同時向用戶端發出相應的響應。另一種代理需要改變用戶端的IP棧,即SOCKS代理。它是可用的最強大、最靈活的代理標準協議。SOCK V4允許Proxy 伺服器內部的用戶端完全地串連到外部的伺服器,SOCK V5增加了對用戶端的授權和認證,因此它是一種安全性較高的代理。本節後面介紹的代理是一種應用程式層上面的代理,所代理的協議是HTTP,也就是經常見到的Web代理。

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

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

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

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

  (4). 能夠發出或解釋伺服器的響應並將該響應傳回給用戶端。

  圖01是網路代理程式服務的一個典型模型圖:


圖01:代理服務的模型

  二.Visual C#實現Web代理服務程式

  Web代理服務是代理服務中最常用的一種代理服務,按照代理服務的層次,它屬於應用程式層代理,是對TCP/IP參考模型中的應用程式層的HTTP協議的代理。

  Web代理服務也是代理服務中的一種,所以它也要滿足代理服務的基本條件。在下面介紹的代理服務程式中,是按照下列的順序來實現其功能的。

  (1). Proxy 伺服器程式偵聽連接埠,接收用戶端瀏覽器發送來的Web請求資訊。

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

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

  (4). Proxy 伺服器程式接收Web伺服器返回頁面資料。

  (5). Proxy 伺服器程式把接收來的資料傳送到用戶端,實現Web代理。

  由於用戶端的對一個地址的瀏覽,要傳送很多的Web請求資訊,為了更快、更準確的處理這些資訊,Web代理服務程式採用了多線程來處理每一個Web請求。細心的讀者可能會發現,處理每一個用戶端的Web請求資訊,Proxy 伺服器軟體都要使用二個Socket,一個是用來接收/傳送客戶機的資訊,一個是和Web伺服器進行交流。為了區分這二個Socket,我們把他們都命名,和伺服器對話的Socket,稱為服務Socket;和用戶端機器對話的Scoket,稱為客戶Socket。

  下面就開始Web代理服務程式的編寫工作。

  這個樣本主要包含三個部分內容:

  ·建立一個Web代理類。

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

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

  下面就是第一部分的具體的實現步驟。

  (一).建立一個Web代理類

  以下是具體的操作步驟如下:

  1. 首先啟動Visual Studio .net,依次選擇"檔案"、"建立"、"項目"菜單後,在彈出"建立項目"對話方塊中將"項目類型"設定為"Visual C#項目",將"模板"設定為"Windows應用程式",在"名稱"文字框中輸入"WebProxy",在"位置"的文字框中輸入"E:/VS.net項目",然後單擊"確定"按鈕。這樣在"E:/VS.NET項目"目錄中就建立了一個新名稱為"WebProxy"檔案夾,裡面存放的就是"WebProxy"的專案檔。

  2. 選擇菜單【項目】|【添加類】,彈出【添加新項】對話方塊

  3. 將【模板】設定【類】

  4. 在【名稱】文字框中輸入【Proxy】,單擊【開啟】按鈕,具體02所示。


圖02:Web代理項目中【添加新項】對話方塊

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

  (1). 由於HTTP是TCP/IP參考模型中的應用程式層協議,它建立於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代理軟體的關鍵,具體實現方法是在建構函式代碼後面,輸入下列代碼,建立Proxy類的Run方法:

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 ;
  strRetPage = strRetPage + ASCII.GetString ( RecvBytes , 0 , rBytes ) ;
  while ( rBytes > 0 )
  {
   rBytes = IPsocket.Receive ( RecvBytes , RecvBytes.Length , 0 ) ;
   strRetPage = strRetPage + ASCII.GetString ( RecvBytes , 0 , rBytes ) ;
  }
  IPsocket.Shutdown ( SocketShutdown.Both ) ;
  IPsocket.Close ( ) ;
  SendMessage ( clientSocket , strRetPage ) ;
  //代理服務軟體往用戶端傳送接收到的資訊
 }
 catch ( Exception exc2 )
 {
  Console.WriteLine ( exc2.ToString ( ) ) ;
 }
}
//接收用戶端的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 ) ;
}

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

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

  10. 至此,Proxy類的定義過程就完成了。把Proxy類執行個體化非常簡單,和以前用的其他完全一樣,具體文法如下:

public Proxy ( Socket socket );

  參數:socket為一個Scoket執行個體

  下面代碼是建立一個Proxy執行個體:

Proxy proxy = new Proxy ( socket ) ;

 

  (二). 利用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 ;
//其中命名空間WebProxy是Proxy類所處的位置,具體可以參閱Proxy.cs源檔案
//中命名空間的定義。

  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地址,由於測試的Proxy 伺服器的IP地址為"10.138.198.213",所有也輸入此IP地址,在【連接埠】文字框中輸入"8000"。具體03所示:


圖03:用戶端設定WebProxy 伺服器對話方塊

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


圖04:Web代理服務程式在伺服器端的運行介面

  四.總結

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.