gpt4 book ai didi

Java HTTP 代理。何时关闭套接字?

转载 作者:行者123 更新时间:2023-12-01 06:23:33 24 4
gpt4 key购买 nike

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

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

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

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

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

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

现在我为不同的流做:

  • 客户端->代理:不执行任何操作
  • proxy->1 服务器:当代理从客户端读取 -1 时关闭
  • 1 个服务器 -> 代理:无
  • 代理 -> 客户端:当所有(服务器->客户端)线程读取 -1 时关闭。 (因此当每个服务器都关闭了与代理的连接时)。

但这并不能阻止它的正确性,而且我很难调试。

这原则上正确吗?

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

最佳答案

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

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

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

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

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

关于Java HTTP 代理。何时关闭套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30697857/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com