17

我需要实现一个 HTTP 代理服务器应用程序,它将来自多个客户端的请求代理到远程服务器。

以下是步骤:

  1. 客户端转发请求到代理
  2. 代理转发请求到服务器
  3. 服务器向代理返回请求
  4. 代理向客户端返回请求。

我只是不确定我应该如何实现这个代理。我的第一个想法是实现一个 tomcat 应用程序,它使用 jersey/apache httpclient 将请求转发到远程服务器并将响应返回给客户端?

有没有更好的方法来实现这样的代理服务器?

代理需要处理多个线程。

4

2 回答 2

11

您不能将其实现为 servlet,也没有理由使用任何形式的 HTTP 客户端。

无功能的代理服务器是一件非常简单的事情:

  1. 接受一个连接并为其启动一个线程。
  2. 读取来自客户端的请求直到空白行。
  3. 提取 GET 或 CONNECT 命令或其他任何命令并连接到指定主机。
  4. 如果失败,发回适当的 HTTP 错误响应,关闭套接字,然后忘记它。
  5. 否则启动两个线程来复制字节,每个方向一个。没有什么花哨的,只是

    while ((count = in.read(buffer)) > 0)
    {
        out.write(buffer, 0, count);
    }
    
  6. 当其中一个套接字读取 EOS 时,关闭另一个套接字以进行输出并退出获取 EOS 的线程。
  7. 如果作为 EOS 源的套接字已经关闭输出,请关闭它们。

或者使用 Apache SQUID。

于 2013-05-09T00:08:51.167 回答
8

查看LittleProxy——它具有用于传入和传出请求的内置类;您可以像在 servlet 中处理 HTTP 请求一样编写代码。

于 2013-11-12T15:53:59.903 回答