2011-04-23 84 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