【发布时间】:2021-04-23 01:51:41
【问题描述】:
这个问题的措辞与 SO (HttpClient: how do I obtain the underlying socket from an existing connection?) 上的另一个问题的措辞相同,但这个问题实际上是关于通过 HTTP(S) 为其他协议建立隧道,因此答案有很大不同。
我要做的是建立一个 HTTPS 连接,然后找出该连接的详细信息。 Java 的 SSLSocket 类会给我我需要的东西,但我需要能够掌握 Socket 本身才能查询它。
有没有办法到达底层Socket? httpclient/httpcore 已经变成了工厂和私有/受保护的事物实现的迷宫,因此很难在 API 周围探索一下,以便在配置完成后弄清楚如何实际获取它们。
【问题讨论】:
-
你到底要从套接字中寻找什么信息?如果
HttpClient没有公开对其Socket对象的访问权限,您可以直接使用(SSL)Socket手动实现HTTP(S)。 -
你不能。公开创建的套接字的唯一方法是提供自己的套接字工厂并自己存储对创建的套接字的引用
-
@RemyLebeau 我正在寻找协商的 TLS 协议和密码套件。我已经限制了那些可以协商的内容,但我想记录那些实际选择用于对话的内容。
-
@Antoniossss 你当然可以直接使用
(SSL)Socket,即使你是从工厂获得的。没有什么说您必须使用HttpClient来实现 HTTP(S)。这是一种方便,而不是要求。如果您了解 TCP 和 HTTP 的工作原理,并且掌握了足够的技能,您可以直接在自己的代码中实现 HTTP(S),而无需使用HttpClient。我不会推荐它,但它是可行的。 -
@RemyLebeau 老实说,我现在真的不喜欢
HttpClient。我在我们正在使用的服务的一些示例代码中容忍了它,但我将把它全部扔到窗外并自己重新实现 HTTP 的东西。我们已经为其他服务编写了自己的 HTTP 客户端,这非常简单。我们不需要 1000 个类和接口来处理 HTTP POST 和 HTTP GET。
标签: java sockets apache-httpclient-4.x