HttpURLConnection执行情况
-
27-09-2019 - |
题
我已经阅读,HttpURLConnection支持持久连接,以便连接,可用于多个请求。我尝试过了,唯一的方式发送的第二个员额是通过调openConnection第二次。否则我有一个IllegalStateException("已经连接");我用如下:
try{
URL url = new URL("http://someconection.com");
}
catch(Exception e){}
HttpURLConnection con = (HttpURLConnection) url.openConnection();
//set output, input etc
//send POST
//Receive response
//Read whole response
//close input stream
con.disconnect();//have also tested commenting this out
con = (HttpURLConnection) url.openConnection();
//Send new POST
第二次请求发送了相同的TCP连接(验证它与查看),但我不能理解为什么(虽然这就是我想要的)自从我们呼吁断开。我检查了源代码HttpURLConnection和实施的确持有保留缓存的连接到相同的目的地。我的问题是,我不能看到怎么连接是放在缓之后,我已发送第一请求。断开关闭连接和不断开,我仍然看不到怎么连接是放回高速缓存。我看到缓存有一个运行方法要经过对所有闲置的连接(我不知道它是怎么叫),但是我找不到怎么连接是放回高速缓存。唯一的地方,似乎发生的情况是,在完成方法的异常的,但这并不是呼吁后一个反应。任何人都可以帮助我这个?
编辑 我感兴趣的是,什么是适当处理的一个HttpUrlConnection目tcp连接的重新使用。应该输入/输出流被关闭之后由一个网址。openConnection();每个时间向新的请求(避免disconnect())?如果是的话,我看不到怎么连接是在被再使用当我打电话网址。openConnection()的第二次,由于连接已经从缓存的第一个请求并不能找到它是如何返回。它是可能的连接不返回的保留高速缓冲存储器(虫?), 但操作系统还没有释放的tcp连接,但并在新的连接,OS返回的缓冲连接(尚未公布)或类似的东西吗?EDIT2 唯一相关的我发现是从 JDK_KeepAlive
...当的应用程序调close() 在输入流的返回 URLConnection.getInputStream(), JAVA's HTTP协议的处理程序将试试 清理的连接,如果 成功的,把连接到一个 连接缓重复利用通过未来 HTTP请求。
但我不确定其处理程序是这样的。太阳。网。www.协议。http。处理程序没有做任何缓存,因为我看到了 谢谢!
解决方案
应该输入/输出流被关闭 随后通过一个网址。openConnection();每一次送的新请求 (避免disconnect())?
是的。
如果是的话,我看不到怎么连接是在 重复使用当我打电话 网址。openConnection()为第二 时间,由于连接已 从高速缓存的第一个 请求并不能找到它是如何 返回。
你是混乱的 HttpURLConnection
与基础 Socket
和 它的 基础TCP连接。他们不相同。的 HttpURLConnection
实例GC会,基础 Socket
是汇集,除非你打电话 disconnect().
其他提示
从如果是的话,为什么不试用HttpURLConnection(我的重点):
每个HttpURLConnection实例是 用于做一个 单个请求但是 底层网络的连接 HTTP服务器可以是透明的 其他实例。 叫 close()方法的输入流或 使用的输出流的一个HttpURLConnection 请求后可自由网络 资源与此相关的 实例,但没有影响的任何 共享的持久连接。叫 disconnect()方法 可 关闭 基础socket如果持续 连接其他空闲时, 时间。
我发现的连接是事实上缓存在输入流被关闭。一旦输入流已经关闭的基础连接缓冲。该HttpURLConnection对象是无法使用,为进一步请求,因为对象被认为仍然"连接",即其布尔连接设置为真正的而不是清除一旦连接放置在缓冲区。因此,每次一个新的HttpUrlConnection应该被化为一个新的职位,但基础TCP连接将可以重复使用,如果还没有超时。所以EJP答案是正确的描述。可以的行为我看见了,(重复使用的TCP连接)尽管明确呼吁disconnect()是由于高速缓存所做的操作系统?我不知道。我希望有人知道可以解释。谢谢。
你怎么"武力使用的HTTP1.0"使用HttpUrlConnection的JAVA?
根据本部分 "持久连接"的Java1.5指南 支持HTTP1.1连接的可以关闭,或在使用java酒店 http.keepAlive
(默认是如此)。此外,java酒店 http.maxConnections
表示最大数量的(并)连接的每个目标是保持在任何给定的时间。
因此,"武力使用的HTTP1.0"可适用于整个应用程序在一旦通过设置java酒店 http.keepAlive
以虚假的。
Hmmh.我可能会丢失的东西在这里(因为这是一个古老的问题),但就我所知,有2众所周知的方法可以力关闭的基础TCP连接:
- 武力的使用HTTP1.0(1.1引入持续连接)--这个如通过http请求线
- 发送"连接"标题与价值"关闭";这将迫关闭。
放弃流将导致空闲TCP连接。响应流应该完全读取。另一件事我忽略了最初和有看到被忽视的大多数答复关于这一主题是忘记处理的错误流的情况例外。代码类似于这种固定我的一个应用程序,没有释放资源:
HttpURLConnection connection = (HttpURLConnection)new URL(uri).openConnection();
InputStream stream = null;
BufferedReader reader = null;
try {
stream = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(stream, Charset.forName("UTF-8")));
// do work on part of the input stream
} catch (IOException e) {
// read the error stream
InputStream es = connection.getErrorStream();
if (es != null) {
BufferedReader esReader = null;
esReader = new BufferedReader(new InputStreamReader(es, Charset.forName("UTF-8")));
while (esReader.ready() && esReader.readLine() != null) {
}
if (esReader != null)
esReader.close();
}
// do something with the IOException
} finally {
// finish reading the input stream if it was not read completely in the try block, then close
if (reader != null) {
while (reader.readLine() != null) {
}
reader.close();
}
// Not sure if this is necessary, closing the buffered reader may close the input stream?
if (stream != null) {
stream.close();
}
// disconnect
if (connection != null) {
connection.disconnect();
}
}
缓冲的读者不是严格必要的,我选择了它因为我的使用情况所需阅读一行的时间。
参见: http://docs.oracle.com/javase/1.5.0/docs/guide/net/http-keepalive.html