開發一個http代理服務器
一、產品原型
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代理服務器