如何重用 HttpUrlConnection? [复制]

Posted

技术标签:

【中文标题】如何重用 HttpUrlConnection? [复制]【英文标题】:How to Reuse HttpUrlConnection? [duplicate] 【发布时间】:2013-04-21 19:44:41 【问题描述】:

我有兴趣重用 HttpUrlConnection(作为我正在开发的服务器和客户端之间的全状态协议的一部分)。 我知道持久 http 有一个 Connection=keep-alive 标头。 现在,我想知道如何重用这样的连接。 我写了这段代码:

URL u = new java.net.URL("http://localhost:8080/Abc/Def");
HttpURLConnection c = (HttpURLConnection) u.openConnection();
c.setRequestMethod("GET");
c.setRequestProperty("Connection", "keep-alive");
c.setHeader("A","B");
c.getInputStream() //here I see that server gets my messages (using DEBUG)
c.setHeader("B","C"); //

现在如何将这个“B”标头重新发送到服务器,我尝试重新连接等,但没有任何效果。

而且服务器也执行response.setHeader("Connection", "keep-alive");

我看过很多论坛,但没有人写过这个。也许HttpURLConnection 不处理这个?

【问题讨论】:

【参考方案1】:

你没有。你关闭这个并创建一个新的。它在后台执行 TCP 连接池和保持活动。

【讨论】:

太棒了,我什至没有想到这可以工作 - 我确信这会打开另一个连接。 除非它经常不这样做,原因尚不清楚。 @aberglas 从未见过,在已经运行了七年的生产代码中。如果你有证据,请出示。没有来源的轶事是不够的。 @Tuntable 有一个由HttpClient 维护的“保持活动缓存”(当您从其 InputStream 中读取时,URL 在内部使用)。在此“KeepAliveStream”上调用close() 会将其放入缓存中。此缓存的关键是基于 URL 协议、主机和端口。在sun.net.www.http.KeepAliveCache.LIFETIME 毫秒(即 5000)后自动删除密钥。因此,如果任何protocol://host:port URL 在 5 秒后没有任何活动,它们将自动关闭。

以上是关于如何重用 HttpUrlConnection? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java之HttpURLConnection的变态事: Keep-Alive

不断开连接HttpUrlConnection意味着资源缺乏或网络滞后

如何从 HttpURLConnection 实例获取 HTTP 请求字符串

如何使用 HttpURLConnection 在请求正文中发送数据?

如何修改 HttpUrlConnection 的标头

如何从 HttpURLConnection 读取 json 数据