如何重复使用HttpUrlConnection?

34

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

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个回答

52

不需要这样做。您可以关闭当前连接并创建一个新的连接。它会在后台执行TCP连接池以实现HTTP keepalive。


4
太棒了,我甚至没有想到这个方法可以奏效——我本以为肯定会打开另一个连接。 - user967710
2
除了通常由于不明原因而无法实现。 - Tuntable
3
从生产代码中看到这种情况还从未发生过,已经运行了七年。如果你有证据,请拿出来。不可靠的轶事不足以作为证据。 - user207421
@Tuntable,HttpClient(在从其InputStream读取时由URL内部使用)维护着一个“保持活动缓存”。调用此“KeepAliveStream”的close()方法将其放入缓存中。该缓存的键基于URL协议、主机和端口。在sun.net.www.http.KeepAliveCache.LIFETIME毫秒(即5000毫秒)后,这些键会自动删除。因此,如果在5秒钟内没有任何对protocol://host:port URL的活动,则它们将被自动关闭。 - Matthieu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接