2011-04-23 83 views
2

我有一個任務用java編寫代理服務器。我必須能夠讀取和修改http頭並阻止提供的黑名單上的一些網站。用Java編寫代理服務器 - 如何?

我用java的經驗,但從來沒有與HTTP,插座,連接端口等工作..

已經幾天試用谷歌一些例子或教程,但我覺得要麼是非常簡單和唐沒有全面的能力,或者非常複雜或不能工作。

你能幫我一些相關的例子,鏈接,教程等...?

我也注意到,我發現一個網頁與開源代理服務器,但他們並沒有真正的工作或非常複雜。

謝謝!

編輯:

您好,我發現一些代碼,偵聽來自瀏覽器來連接並開始一個新的線程爲每個連接。

public class Main { 
public static void main(String[] args) throws IOException { 
    ServerSocket serverSocket = null; 
boolean listening = true; 

int port = 10000; //default 
try { 
    port = Integer.parseInt(args[0]); 
} catch (Exception e) { 
    //ignore me 
} 

try { 
    serverSocket = new ServerSocket(port); 
    System.out.println("Started on: " + port); 
} catch (IOException e) { 
    System.err.println("Could not listen on port: " + args[0]); 
    System.exit(-1); 
} 

while (listening) { 
    new ProxyThreadServer(serverSocket.accept()).start(); 
} 
serverSocket.close(); 
} 

} 

的一部分,我真的很困惑與是如何轉移的請求到服務器(URL),從它那裏得到的響應併發送到瀏覽器的響應。

所以基本上我需要4個步驟:

Listen and get the request from a browser. 
Forward the request to the web-server. 
Get the response from the web server. 
Send the response to the browser. 

額外的功能正在與頁眉和阻止某些聯繫。但是,開始時這4個步驟將會很好。

+3

這是太開放和模糊的話題在這裏。你有關於如何寫一小部分的問題嗎?您是否瞭解代理服務器的工作原理,例如_什麼它?_ – 2011-04-23 20:33:01

+0

嗨,經過一段時間之後。我確實瞭解代理如何工作。它基本上應該在瀏覽器和網站的中間。它必須作爲雙向渠道運作。基本的需求就是成爲一個透明的隧道。額外的功能應該是能夠編輯標題和過濾一些網站或IP。 – Gil 2011-04-23 21:28:59

回答

4

最簡單的方法是讓線程接受ServerSocket上的新連接。對於每個連接(通過調用accept),啓動一個新線程來處理該連接。將您通過accept調用收到的新Socket傳遞給新的會話處理線程。這是代理服務器的核心。

對於這些會話處理線程中的每一個,都需要從客戶端讀取HTTP請求並決定如何處理它。您需要確定要與哪個HTTP服務器聯繫,然後使用您創建的新對象Socket連接到它。您可以在客戶端和服務器之間進行雙向轉發,因此您的代理對任何一端都是透明的。

HTTP是一個複雜的野獸,所以希望你的任務範圍相當有限,在這種情況下,這個大綱應該可以幫助你開始。

希望有幫助!

+0

第一段實際上是任何(線程每連接)服務器的核心,而不僅僅是代理服務器! – 2011-04-23 21:31:23

+0

謝謝!這對開始非常好。我編輯了我的第一個問題並添加了一些代碼。如果您能看一看並指導我如何繼續下去,我將非常感激。 – Gil 2011-04-23 21:41:50