【问题标题】:Java HTTP Proxy. When to close sockets?Java HTTP 代理。何时关闭套接字?
【发布时间】:2015-08-22 06:04:39
【问题描述】:

我正在为一个大学项目用 Java 编写一个相当简单的 HTTP 代理(因此我只能使用内置的 JDK 功能)。

在编写软件时,我对持久连接感到很困惑。 代理应该能够解析/操作所有 http 消息,所以我需要收集所有内容,不能只是转发它。

原则上我是这样做的: 一个线程正在侦听来自浏览器的连接。当连接出现时,我启动一个线程。它从流中读取(客户端-> 代理)并将其转发到(代理-> 服务器)。

现在我听说浏览器可能对不同主机使用相同的代理连接,因此可能有 1 个线程用于客户端->代理通信和多个子线程转发到不同的主机。

我的代理在某些情况下已经可以工作了。但是我有线程没有被杀死的问题。

我什么时候必须关闭不同连接的 Java 套接字流?

现在我为不同的流做:

  • 客户端->代理:什么都不做
  • proxy->1 server: 当proxy从客户端读取-1时关闭
  • 1 个服务器 -> 代理:无
  • 代理->客户端:当所有(服务器->客户端)线程读取-1时关闭。 (所以当每台服务器都关闭了与代理的连接时)。

但这并没有停止正确,而且我很难调试。

这原则上正确吗?

还要补充一点:我是否必须处理 proxy-connection:keep-alive 和 Connection:close 标头,或者我可以只转发它们吗?因为目前我没有做任何与他们相关的事情,但我感觉这是主要问题,我只是想确定一下。

【问题讨论】:

    标签: java sockets http proxy


    【解决方案1】:

    代理既可以是服务器,也可以是客户端,两者的连接很大程度上是独立的,应该分开管理。

            conn                   conn
    client----------server-client---------server
                    -------------
                       proxy
    

    客户端-代理连接用于承载多个请求(可能到不同的服务器)。

    一个代理服务器连接用于承载多个请求(可能来自不同的客户端)

    Connection 标头是逐跳的;它不应该被转发。如何创建/终止连接是在客户端-代理或代理-服务器之间,而不是在客户端-服务器之间。

    【讨论】:

      【解决方案2】:

      我什么时候必须关闭不同连接的 Java 套接字流?

      1. 当读取在套接字上返回 -1 时,关闭对面的套接字以进行输出。
      2. 如果您已经关闭了从中读取 EOS 的套接字,请将它们都关闭。
      3. 您不必对 Connection: keepalive 和 Connection:close 标头做任何事情:只需转发它们并让端点决定。您所要做的就是正确响应并传播流结束。

      这是透明地传播 FIN 的正确方法。流是上游还是下游,与上述没有任何区别。

      【讨论】:

        猜你喜欢
        • 2012-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-18
        • 1970-01-01
        • 2014-09-09
        • 2013-05-03
        相关资源
        最近更新 更多