【问题标题】:"Socket sharing" in HttpURLConnection implementationHttpURLConnection 实现中的“套接字共享”
【发布时间】:2016-01-12 08:27:18
【问题描述】:

引用developer site

为了减少延迟,此类可能会为多个请求/响应对重用相同的底层 Socket。因此,HTTP 连接的打开时间可能会超过必要的时间。

这意味着一个 TCP 连接可能由多个 HttpURLConnection 实例共享。(另请参阅here)。

假设我有两个独立的后台线程,它们通过两个不同的HttpURLConnection同一主机 发送请求。如果两个连接共享底层 Socket,服务器返回的数据将被两个线程同时读取,导致数据损坏。

但是,当我测试我的 Android 应用时,我从未遇到过这个问题。那么这是否意味着 Socket 永远不会共享或者我错过了什么?

【问题讨论】:

    标签: java android sockets


    【解决方案1】:

    声明

    为了减少延迟,此类可能会为多个请求/响应对重用相同的底层 Socket。

    并不意味着套接字总是被重用,它只是说明它们可以被重用。如果两个线程同时使用两个URLConnections,它们就不能共享一个socket,因为一个socket不能被多个线程同时使用。

    URLConnection 实现保证单个URLConnection 独立于同一运行时环境中的任何其他连接,因此并行连接不能重用它们的套接字。

    但是,如果一个线程在另一个线程打开它的URLConnection 之前关闭了它的URLConnection,它们可能会重用现有的套接字。

    【讨论】:

    • 那么如果我有 20 个线程同时请求,我在运行时至少有 20 个不同的 TCP 连接? http rfc 表示客户端与同一主机的连接不应超过 2 个。
    • 正确,除非您强制执行自己的限制,否则 Java 会很乐意创建更多 TCP 连接。你期待什么? URLConnection 是否应该阻塞直到少于两个其他 URLConnections 连接到同一主机?此类建议应在程序和/或服务器中实现,而不是在标准库中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    相关资源
    最近更新 更多