女朋友過生日,我花了20分鐘給她寫了一個代理服務器

代理服務器.png

女朋友說:“看你最近挺辛苦的喷户,我送你一個禮物吧唾那。你看看想要什么,我來準備∧只瘢”

我想了半天期犬,從書到鞋子到電子產品最后到生活用品,感覺自己什么都不缺避诽,然后和她說:“你省省錢吧龟虎,我什么都不需要∩陈”

她堅持要送:“不行鲤妥,你一定要說一個禮物,我想送你東西了拱雏∶薨玻”

于是,我認真了起來铸抑,拿起手機贡耽,上淘寶逛了幾分鐘,但還是沒能想出來缺點什么鹊汛,最后實在沒辦法了:“這樣吧蒲赂,如果你實在想送東西,那你就寫一個代理服務器吧”

她什么也沒說刁憋,哈哈大笑了起來滥嘴,然后寫了這篇博客。

定義

允許一個網(wǎng)絡終端(一般為客戶端)通過這個服務與另一個網(wǎng)絡終端(一般為服務器)進行非直接的連接职祷。如圖所示氏涩,為普通 Web 應用通信方式與采用代理服務器的通信方式的對比。


在這里插入圖片描述

原理

代理服務器在指定端口(例如 8080) 監(jiān)聽瀏覽器的訪問請求(需要在客戶端瀏覽器進行相應的設置)有梆, 接收到瀏覽器對遠程網(wǎng)站的瀏覽請求時是尖,代理服務器開始在代理服務器的緩存中檢索 URL 對應的對象(網(wǎng)頁、圖像等對象)泥耀,找到對象文件后饺汹, 提取該對象文件的最新被修改時間; 代理服務器程序在客戶的請求報文首部插入<If-Modified-Since: 對象文件的最新被修改時間>痰催,并向原 Web 服務器轉發(fā)修改后的請求報文兜辞。 如果代理服務器沒有該對象的緩存,則會直接向原服務器轉發(fā)請求報文夸溶, 并將原服務器返回的響應直接轉發(fā)給客戶端逸吵,同時將對象緩存到代理服務器中。 代理服務器程序會根據(jù)緩存的時間缝裁、大小和提取記錄等對緩存進行清理扫皱。本實驗需實現(xiàn)一個簡單的 HTTP 代理服務器, 可以分為兩個步驟:(首先請設置瀏覽器開啟本地代理,注意設置代理端口與代理服務器監(jiān)聽端口保持一致)韩脑。

內容

  1. 設計并實現(xiàn)一個基本 HTTP 代理服務器氢妈。 要求在指定端口(例如8080) 接收來自客戶的 HTTP 請求并且根據(jù)其中的 URL 地址訪問該地址所指向的 HTTP 服務器(原服務器), 接收 HTTP 服務器的響應報文段多,并將響應報文轉發(fā)給對應的客戶進行瀏覽首量。
  2. 設計并實現(xiàn)一個支持 Cache 功能的 HTTP 代理服務器。 要求能緩存原服務器響應的對象进苍,并能夠通過修改請求報文(添加 if-modified-since頭行)加缘,向原服務器確認緩存對象是否是最新版本。(選作內容琅捏,加分項目生百,可以當堂完成或課下完成)
  3. 擴展 HTTP 代理服務器,支持如下功能:
    a) 網(wǎng)站過濾:允許/不允許訪問某些網(wǎng)站柄延;
    b) 用戶過濾:支持/不支持某些用戶訪問外部網(wǎng)站蚀浆;
    c) 網(wǎng)站引導:將用戶對某個網(wǎng)站的訪問引導至一個模擬網(wǎng)站(釣魚)。

過程

設置瀏覽器代理

以IE瀏覽器設置為例:打開瀏覽器工具瀏覽器選項——連接——局域網(wǎng)設置——代理服務器搜吧。設置地址為127.0.0.1市俊,端口號為10240。


在這里插入圖片描述

實現(xiàn)一個基本的HTTP代理服務器

HTTP代理服務器用于一個網(wǎng)絡終端(一般為客戶端)通過代理服務與另一個網(wǎng)絡終端(一般為服務器)進行非直接的連接滤奈。設計的流程圖如下:


在這里插入圖片描述

(1) InitSocket()函數(shù)
功能:初始化套接字
(2) ProxyThread()函數(shù)
功能:線程執(zhí)行函數(shù)
(3) ParseHttpHead()函數(shù)
功能:解析 TCP 報文中的 HTTP 頭部
(4) ConnectToServer()函數(shù)
功能:根據(jù)主機創(chuàng)建目標服務器套接字摆昧,并連接

Cache功能

  1. 客戶端第一次請求服務器中的數(shù)據(jù)時,代理服務器將該請求返回的響應緩存下來蜒程,存到本地的文件下绅你。
  2. 當客戶端第二次訪問該數(shù)據(jù)時,代理服務器檢查本地是否有該請求的響應昭躺,如果沒有忌锯,則繼續(xù)緩存;如果有领炫,則通過向服務器發(fā)送一個請求偶垮,對比最后修改時間來判斷緩存是否過期,如果服務器返回狀態(tài)碼304帝洪,則沒過期似舵;如果服務器返回狀態(tài)碼200,則緩存過期葱峡,則更新本地緩存砚哗。
  3. 相應函數(shù)
    (1)getfileDate()函數(shù)
    功能:訪問本地文件,獲取本地緩存中的日期
    (2)sendnewHTTP()函數(shù)
    功能:修改請求報文砰奕,添加 if-modified-since頭行
    先查看請求報文格式:
    (3)checkfileCache()函數(shù)
    功能:檢測主機返回的狀態(tài)碼频祝,如果是304則從本地獲取緩存進行轉發(fā)泌参,否則需要更新緩存
    (4)storefileCache()函數(shù)
    功能:檢測主機返回的狀態(tài)碼脆淹,如果是200則本地獲取緩存

實現(xiàn)擴展功能

網(wǎng)站過濾

首先設置不允許訪問網(wǎng)站的url


在這里插入圖片描述

在處理客戶端請求時常空,檢查請求消息中的url是否被允許訪問,如果不允許訪問盖溺,則拒絕


在這里插入圖片描述

用戶過濾

將代理服務器的網(wǎng)絡通信IP地址從INADDR_ANY更改為特定的某個IP地址漓糙,從而只有該IP地址能通過
代理服務器訪問外部網(wǎng)站,其他IP均不能


在這里插入圖片描述

網(wǎng)站引導

首先設置目標網(wǎng)站和相應的釣魚網(wǎng)站和主機名


在這里插入圖片描述

在處理客戶端請求時烘嘱,將請求消息中的url和host替換成事先設置好的模擬網(wǎng)站的url和host


在這里插入圖片描述

源碼

github代碼鏈接

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末昆禽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蝇庭,更是在濱河造成了極大的恐慌醉鳖,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哮内,死亡現(xiàn)場離奇詭異盗棵,居然都是意外死亡,警方通過查閱死者的電腦和手機北发,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門纹因,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人琳拨,你說我怎么就攤上這事瞭恰。” “怎么了狱庇?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵惊畏,是天一觀的道長。 經常有香客問我密任,道長颜启,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任批什,我火速辦了婚禮农曲,結果婚禮上,老公的妹妹穿的比我還像新娘驻债。我一直安慰自己乳规,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布合呐。 她就那樣靜靜地躺著暮的,像睡著了一般。 火紅的嫁衣襯著肌膚如雪淌实。 梳的紋絲不亂的頭發(fā)上冻辩,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天猖腕,我揣著相機與錄音,去河邊找鬼恨闪。 笑死倘感,一個胖子當著我的面吹牛,可吹牛的內容都是我干的咙咽。 我是一名探鬼主播老玛,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼钧敞!你這毒婦竟也來了蜡豹?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤溉苛,失蹤者是張志新(化名)和其女友劉穎镜廉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愚战,經...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡娇唯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了凤巨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片视乐。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖敢茁,靈堂內的尸體忽然破棺而出佑淀,到底是詐尸還是另有隱情,我是刑警寧澤彰檬,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布伸刃,位于F島的核電站,受9級特大地震影響逢倍,放射性物質發(fā)生泄漏捧颅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一较雕、第九天 我趴在偏房一處隱蔽的房頂上張望碉哑。 院中可真熱鬧,春花似錦亮蒋、人聲如沸扣典。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贮尖。三九已至,卻和暖如春趁怔,著一層夾襖步出監(jiān)牢的瞬間湿硝,已是汗流浹背薪前。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留关斜,地道東北人示括。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像蚤吹,于是被迫代替她去往敵國和親例诀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內容

  • 第一章裁着、HTTP概述1、Web瀏覽器拱她、服務器和相關的Web應用程序都是通過HTTP相互通信的二驰,HTTP是現(xiàn)代全球因...
    橫沖直撞666閱讀 641評論 0 1
  • Web 頁面的實現(xiàn) Web 基于 HTTP 協(xié)議通信 客戶端(Client)的 Web 瀏覽器從 Web 服務器端...
    毛圈閱讀 1,092評論 0 2
  • 隨心_9862閱讀 228評論 0 3
  • 前天剛讀完《島上書店》,因為我一直在鬧書荒秉沼,所以前段時間在微博上看一份書單桶雀,對于這本書排的的位置靠前而且評價挺特別...
    素沙閱讀 174評論 0 1
  • redis安裝 安裝依賴 安裝redis 配置環(huán)境變量: 開啟redis服務 關閉redis 設置后臺運行 將啟動...
    itbsl閱讀 1,303評論 0 1