使用Java编程代理服务器 - 如何?

时间:2011-04-23 20:26:02

标签: java http proxy

我有一个用java编写代理服务器的任务。我必须能够读取和修改http标头并阻止提供的黑名单上的一些网站。

我有使用java的经验,但从未使用过http,套接字,连接,端口等。

已经有几天尝试Google的一些示例或教程,但我发现它要么非常简单,要么没有完整功能,要么非常复杂或无法正常工作。

你能帮我一些相关的例子,链接,教程等......?

我还要注意,我发现了一个带有开源代理服务器的网页,但它们并没有真正起作用或非常复杂。

谢谢!

编辑:

嗨,我发现一些代码可以监听来自浏览器的连接并为每个连接启动一个新线程。

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.

额外的功能是使用标头并阻止一些连接。但是从一开始这四个步骤就可以了。

1 个答案:

答案 0 :(得分:4)

最简单的方法是让一个线程接受ServerSocket上的新连接。对于它获得的每个连接(通过accept调用),启动一个新线程来处理该连接。将通过Socket调用收到的新accept传递给新的会话处理线程。这是代理服务器的核心。

对于每个会话处理线程,您需要从客户端读取HTTP请求并决定如何处理它。您需要确定要与哪个HTTP服务器联系,然后使用您创建的新Socket对象连接到该服务器。此时,您可以在客户端和服务器之间进行双向转发,这样您的代理就可以对任一端进行透明。

HTTP是一个复杂的野兽,所以希望你的作业范围非常有限,在这种情况下,这个大纲应该可以帮助你开始。

希望有所帮助!