1. 程式人生 > >Atitit http 代理原理 atiHttpProxy 大木馬

Atitit http 代理原理 atiHttpProxy 大木馬

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

Atitit. http 代理原理  atiHttpProxy  大木馬

 

 

1.面這張圖可以清晰地闡明HttpProxy的實現原理:1

2

.代理伺服器用途1

3.其中流程具體如下:2

4.設計規劃3

5.結束語4

 

 

1. 面這張圖可以清晰地闡明HttpProxy的實現原理: 


2. 代理伺服器用途

代理伺服器看成是一種擴充套件瀏覽器功能的途徑。例如,在把資料傳送給瀏覽器之前,可以用代理伺服器壓縮資料

偵錯程式

資料蒐集器

木馬病毒

3. 其中流程具體如下:

 
1、客戶端通過瀏覽器向代理伺服器傳送HttpRequest(GET/POST);
2、代理伺服器讀取請求頭,抽取出請求的具體目標伺服器HOST和PORT;


3、代理伺服器把請求頭髮送給目標伺服器;
4、代理伺服器建立管道,供客戶端和目標伺服器通過兩個Socket通訊。

 

 

不管以哪種方式應用代理伺服器,其監控HTTP傳輸的過程總是如下:

· 步驟一:內部的瀏覽器傳送請求給代理伺服器。請求的第一行包含了目標URL

· 步驟二:代理伺服器讀取該URL,並把請求轉發給合適的目標伺服器。

· 步驟三:代理伺服器接收來自Internet目標機器的應答,把應答轉發給合適的內部瀏覽器。

例如,假設有一個企業的僱員試圖訪問www.cn.ibm.com網站。如果沒有代理伺服器,僱員的瀏覽器開啟的

Socket通向執行這個網站的Web服 務器,從Web伺服器返回的資料也直接傳遞給僱員的瀏覽器。如果瀏覽器被配置成使用代理伺服器,則請求首先到達代理伺服器;隨後,代理伺服器從請求的第一 行提取目標URL,開啟一個通向www.cn.ibm.comSocket。當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方法利用映像APIReflection 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編輯器功能,我們增加了如下幾點新功能,幫助你用它寫部落格:

  1. 全新的介面設計 ,將會帶來全新的寫作體驗;
  2. 在創作中心設定你喜愛的程式碼高亮樣式,Markdown 將程式碼片顯示選擇的高亮樣式 進行展示;
  3. 增加了 圖片拖拽 功能,你可以將本地的圖片直接拖拽到編輯區域直接展示;
  4. 全新的 KaTeX數學公式 語法;
  5. 增加了支援甘特圖的mermaid語法1 功能;
  6. 增加了 多螢幕編輯 Markdown文章功能;
  7. 增加了 焦點寫作模式、預覽模式、簡潔寫作模式、左右區域同步滾輪設定 等功能,功能按鈕位於編輯區域與預覽區域中間;
  8. 增加了 檢查列表 功能。

功能快捷鍵

撤銷: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.

圖片: Alt

帶尺寸的圖片: Alt

當然,我們為了讓使用者更加便捷,我們增加了圖片拖拽功能。

如何插入一段漂亮的程式碼片

部落格設定頁面,選擇一款你喜歡的程式碼片高亮樣式,下面展示同樣高亮的 程式碼片.

// An highlighted block var foo = 'bar'; 

生成一個適合你的列表

  • 專案
    • 專案
      • 專案
  1. 專案1
  2. 專案2
  3. 專案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公式展示 Γ ( n ) = ( n 1 ) ! n N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通過尤拉積分

Γ ( z ) = 0 t z 1 e t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

你可以找到更多關於的資訊 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檔案,在上方工具欄可以選擇匯入功能進行對應副檔名的檔案匯入,
繼續你的創作。


  1. mermaid語法說明 ↩︎

  2. 註腳的解釋 ↩︎