Atitit http 代理原理 atiHttpProxy 大木馬
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
Atitit. http 代理原理 atiHttpProxy 大木馬
1. 面這張圖可以清晰地闡明HttpProxy的實現原理:
2. 代理伺服器用途
代理伺服器看成是一種擴充套件瀏覽器功能的途徑。例如,在把資料傳送給瀏覽器之前,可以用代理伺服器壓縮資料
偵錯程式
資料蒐集器
木馬病毒
3. 其中流程具體如下:
1、客戶端通過瀏覽器向代理伺服器傳送HttpRequest(GET/POST);
2、代理伺服器讀取請求頭,抽取出請求的具體目標伺服器HOST和PORT;
3、代理伺服器把請求頭髮送給目標伺服器;
4、代理伺服器建立管道,供客戶端和目標伺服器通過兩個Socket通訊。
不管以哪種方式應用代理伺服器,其監控HTTP傳輸的過程總是如下:
· 步驟一:內部的瀏覽器傳送請求給代理伺服器。請求的第一行包含了目標URL。
· 步驟二:代理伺服器讀取該URL,並把請求轉發給合適的目標伺服器。
· 步驟三:代理伺服器接收來自Internet目標機器的應答,把應答轉發給合適的內部瀏覽器。
例如,假設有一個企業的僱員試圖訪問www.cn.ibm.com網站。如果沒有代理伺服器,僱員的瀏覽器開啟的
當然,代理伺服器並非只適用於企業環境。作為一個開發者,擁有一個自己的代理伺服器是一件很不錯的事情。例如,我們可以用代理伺服器來分析瀏覽器和Web伺服器的互動過程。測試和解決Web應用中存在的問題時,這種功能是很有用的。我們甚至還可以同時使用多個代理伺服器(大多數代理伺服器允許多個伺服器鏈 接在一起使用)。例如,我們可以有一個企業的代理伺服器,再加上一個用Java編寫的代理伺服器,用來除錯應用程式。但應該注意的是,代理伺服器鏈上的每 一個伺服器都會對效能產生一定的影響。
4. 設計規劃
正如其名字所示,代理伺服器只不過是一種特殊的伺服器。和大多數伺服器一樣,如果要處理多個請求,代理伺服器應該使用執行緒。下面是一個代理伺服器的基本規劃:
1. 等待來自客戶(Web瀏覽器)的請求。
2. 啟動一個新的執行緒,以處理客戶連線請求。
3. 讀取瀏覽器請求的第一行(該行內容包含了請求的目標URL)。
4. 分析請求的第一行內容,得到目標伺服器的名字和埠。
5. 開啟一個通向目標伺服器(或下一個代理伺服器,如合適的話)的Socket。
6. 把請求的第一行傳送到輸出Socket。
7. 把請求的剩餘部分發送到輸出Socket。
8. 把目標Web伺服器返回的資料傳送給發出請求的瀏覽器。
當然,如果考慮細節的話,情況會更復雜一些。實際上,這裡主要有兩個問題要考慮:第一,從Socket按行讀取資料最適合進一步處理,但這會產生效能瓶 頸;第二,兩個Socket之間的連線必需高效。有幾種方法可以實現這兩個目標,但每一種方法都有各自的代價。例如,如果要在資料進入的時候進行過濾,這 些資料最好按行讀取;然而,大多數時候,當資料到達代理伺服器時,立即把它轉發出去更適合高效這一要求。另外,資料的傳送和接收也可以使用多個獨立的線 程,但大量地建立和拆除執行緒也會帶來效能問題。因此,對於每一個請求,我們將用一個執行緒處理資料的接收和傳送,同時在資料到達代理伺服器時,儘可能快速地 把它轉發出去。
當代理伺服器連線到Web伺服器之後,我用一個簡單的迴圈在兩個Socket之間傳遞資料。這裡可能出現一個問題,即如果沒有可操作的資料,呼叫read 方法可能導致程式阻塞,從而掛起程式。為防止出現這個問題,我用setSoTimeout方法設定了Socket的超時時間(參見Listing 2)。這樣,如果某個Socket不可用,另一個仍舊有機會進行處理,我不必建立一個新的執行緒。
和所有執行緒物件一樣,HttpProxy類的主要工作在run方法內完成(見Listing 2)。run方法實現了一個簡單的狀態機,從Web瀏覽器每次一個讀取字元,持續這個過程直至有足夠的資訊找出目標Web伺服器。然後,run開啟一個通 向該Web伺服器的Socket(如果有多個代理伺服器被連結在一起,則run方法開啟一個通向鏈裡面下一個代理伺服器的Socket)。開啟Socket之後,run先把部分的請求寫入Socket,然後呼叫pipe方法。pipe方法直接在兩個Socket之間以最快的速度執行讀寫操作。
如果資料規模很大,另外建立一個執行緒可能具有更高的效率;然而,當資料規模較小時,建立新執行緒所需要的開銷會抵消它帶來的好處。
Listing 3顯示了一個很簡單的main方法,可以用來測試HttpProxy類。大部分的工作由一個靜態的startProxy方法完成(見Listing 4)。這個方法用到了一種特殊的技術,允許一個靜態成員建立HttpProxy類(或HttpProxy類的子類)的例項。它的基本思想是:把一個Class物件傳遞給startProxy類;然後,startProxy方法利用映像API(Reflection API)和getDeclaredConstructor方法確定該Class物件的哪一個建構函式接受一個Socket引數;最 後,startProxy方法呼叫newInstance方法建立該Class物件。
利用這種技術,我們可以在不建立startProxy方法定製版本的情況下,擴充套件HttpProxy類。要得到給定類的Class物件,只需在正常的名字 後面加上.class(如果有某個物件的一個例項,則代之以呼叫getClass方法)。由於我們把Class物件傳遞給了startProxy方法,所 以建立HttpProxy的派生類時,就不必再特意去修改startProxy。(下載程式碼中包含了一個派生得到的簡單代理伺服器)。
5. 結束語
利用派生類定製或調整代理伺服器的行為有兩種途徑:修改主機的名字,或者捕獲所有通過代理伺服器的資料。processHostName方法允許代理服務 器分析和修改主機名字。如果啟用了日誌記錄,代理伺服器為每一個通過伺服器的字元呼叫writeLog方法。如何處理這些資訊完全由我們自己決定――可以 把它寫入日誌檔案,可以把它輸出到控制檯,或進行任何其他滿足我們要求的處理。writeLog輸出中的一個Boolean標記指示出資料是來自瀏覽器還 是Web主機。
和許多工具一樣,代理伺服器本身並不存在好或者壞的問題,關鍵在於如何使用它們。代理伺服器可能被用於侵犯隱私,但也可以阻隔偷窺者和保護網路。即使代理 伺服器和瀏覽器不在同一臺機器上,我也樂意把代理伺服器看成是一種擴充套件瀏覽器功能的途徑。例如,在把資料傳送給瀏覽器之前,可以用代理伺服器壓縮資料;未 來的代理伺服器甚至還可能把頁面從一種語言翻譯成另一種語言……可能性永無止境。
多執行緒Http代理伺服器 Java實現 - 獨上高樓 - ITeye技術網站.htm
用Java開發代理伺服器.htm
給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow
你好! 這是你第一次使用 **Markdown編輯器** 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。新的改變
我們對Markdown編輯器進行了一些功能拓展與語法支援,除了標準的Markdown編輯器功能,我們增加了如下幾點新功能,幫助你用它寫部落格:
- 全新的介面設計 ,將會帶來全新的寫作體驗;
- 在創作中心設定你喜愛的程式碼高亮樣式,Markdown 將程式碼片顯示選擇的高亮樣式 進行展示;
- 增加了 圖片拖拽 功能,你可以將本地的圖片直接拖拽到編輯區域直接展示;
- 全新的 KaTeX數學公式 語法;
- 增加了支援甘特圖的mermaid語法1 功能;
- 增加了 多螢幕編輯 Markdown文章功能;
- 增加了 焦點寫作模式、預覽模式、簡潔寫作模式、左右區域同步滾輪設定 等功能,功能按鈕位於編輯區域與預覽區域中間;
- 增加了 檢查列表 功能。
功能快捷鍵
撤銷:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜體:Ctrl/Command + I
標題:Ctrl/Command + Shift + H
無序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
檢查列表:Ctrl/Command + Shift + C
插入程式碼:Ctrl/Command + Shift + K
插入連結:Ctrl/Command + Shift + L
插入圖片:Ctrl/Command + Shift + G
合理的建立標題,有助於目錄的生成
直接輸入1次#,並按下space後,將生成1級標題。
輸入2次#,並按下space後,將生成2級標題。
以此類推,我們支援6級標題。有助於使用TOC
語法後生成一個完美的目錄。
如何改變文字的樣式
強調文字 強調文字
加粗文字 加粗文字
標記文字
刪除文字
引用文字
H2O is是液體。
210 運算結果是 1024.
插入連結與圖片
連結: link.
圖片:
帶尺寸的圖片:
當然,我們為了讓使用者更加便捷,我們增加了圖片拖拽功能。
如何插入一段漂亮的程式碼片
去部落格設定頁面,選擇一款你喜歡的程式碼片高亮樣式,下面展示同樣高亮的 程式碼片
.
// An highlighted block var foo = 'bar';
生成一個適合你的列表
- 專案
- 專案
- 專案
- 專案
- 專案1
- 專案2
- 專案3
- 計劃任務
- 完成任務
建立一個表格
一個簡單的表格是這麼建立的:
專案 | Value |
---|---|
電腦 | $1600 |
手機 | $12 |
導管 | $1 |
設定內容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文字居中 | 第二列文字居右 | 第三列文字居左 |
SmartyPants
SmartyPants將ASCII標點字元轉換為“智慧”印刷標點HTML實體。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' |
‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" |
“Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash |
– is en-dash, — is em-dash |
建立一個自定義列表
- Markdown
- Text-to- HTML conversion tool
- Authors
- John
- Luke
如何建立一個註腳
一個具有註腳的文字。2
註釋也是必不可少的
Markdown將文字轉換為 HTML。
KaTeX數學公式
您可以使用渲染LaTeX數學表示式 KaTeX:
Gamma公式展示 是通過尤拉積分
你可以找到更多關於的資訊 LaTeX 數學表示式here.
新的甘特圖功能,豐富你的文章
gantt
dateFormat YYYY-MM-DD
title Adding GANTT diagram functionality to mermaid
section 現有任務
已完成 :done, des1, 2014-01-06,2014-01-08
進行中 :active, des2, 2014-01-09, 3d
計劃一 : des3, after des2, 5d
計劃二 : des4, after des3, 5d
- 關於 甘特圖 語法,參考 這兒,
UML 圖表
可以使用UML圖表進行渲染。 Mermaid. 例如下面產生的一個序列圖::
這將產生一個流程圖。:
- 關於 Mermaid 語法,參考 這兒,
FLowchart流程圖
我們依舊會支援flowchart的流程圖:
- 關於 Flowchart流程圖 語法,參考 這兒.
匯出與匯入
匯出
如果你想嘗試使用此編輯器, 你可以在此篇文章任意編輯。當你完成了一篇文章的寫作, 在上方工具欄找到 文章匯出 ,生成一個.md檔案或者.html檔案進行本地儲存。
匯入
如果你想載入一篇你寫過的.md檔案或者.html檔案,在上方工具欄可以選擇匯入功能進行對應副檔名的檔案匯入,
繼續你的創作。
註腳的解釋 ↩︎