1. 程式人生 > >開發一個http代理服務器

開發一個http代理服務器

class mage pro 轉發 剛才 瀏覽器 proxy 恢復 end

一、產品原型

技術分享

1、配置使用代理服務器

技術分享

技術分享

參照上圖設置,HTTPS和FTP等不要設置(本代理服務器未對這兩種協議進行處理), IP是 127.0.0.1 表示代理服務器是在本機,監聽端口設成8888。

在IE裏設置完後,我們會發現其它瀏覽器也自動開始使用代理服務器了,這是因為設置代理服務器是系統的功能,每個瀏覽器打開的都是同一個設置代理服務器的程序。

其實,我們可以實現一個自動設置代理服務器的功能,這樣,當我們的代理服務器啟動的時候,就自動將本機的代理服務器設置成自己,退出的時候,再恢復成原樣,這樣就不再需要向上面一樣手動設置了。

2、使用代理服務器

配置完畢後,在瀏覽器裏輸入網址: http://www.baidu.com

技術分享

技術分享

我們可以清楚看到,所有的請求和響應信息都已經被監聽到了。

二、關鍵點設計

1、業務流程

參考Fiddler 的設計思想,在程序啟動時,new 一個代理(Proxy)類的實例,然後調用這個實例的Start方法,來啟動代理服務,

在Start方法裏就是不停的異步監聽本機的8888端口(還記得剛才設置代理服務器時設置的端口嗎),

如果監聽到了,就從線程池裏,取出來一個線程,並在這個線程裏,構造一個Session對象。一個Session對象,代表客戶端與服務器的一次會話,在有代理服務器情況下的一次會話(Session)代表的是:

1.從客戶端讀請求

2.重新包裝客戶端的請求,轉發至目標服務器.

3.從目標服務器讀取響應信息

4.包裝接收到的響應信息並返回給客戶端。

故而在Session類裏,封裝一個ClientChatter類型的名為Request的對象,用來實現和客戶端的通訊,

另外又封裝了一個ServiceChatter類型的名為Response的對象,用來實現和目標服務器的通訊。

技術分享

2、ObtainRequest

技術分享

3、response.ResendRequest

4、response.ReadRequest

5、returnResponse

開發一個http代理服務器