java实现http的长连接
现在java的URLConnection类是怎么实现http的长连接的? 我的理解: 当应用程序读取完响应体内容后或者调用 close() 关闭了URLConnection.getInputStream()返回的流, JDK中的HTTP协议句柄将关闭连接,并将连接放到连接缓存中。下次获取URLConnection示例,并获取InputStream流时,会再次使用之前打开的TCP连接。也就是说:
public static String sendPost(String url, String param) { String result = ""; try { URL httpurl = new URL(url); HttpURLConnection httpConn = (HttpURLConnection) httpurl.openConnection(); httpConn.setDoOutput(true); httpConn.setDoInput(true); PrintWriter out = new PrintWriter(httpConn.getOutputStream()); out.print(param); out.flush(); out.close(); BufferedReader in = new BufferedReader(new InputStreamReader(httpConn.getInputStream())); String line; while ((line = in.readLine()) != null) { result += line; } in.close(); } catch (Exception e) { System.out.println("没有结果!" + e); } return result; }我在间隔较短的时间内调用上面的方法(连接的地址不一样,但还是同一个服务器同一个项目),用的是同一个TCP连接。我这么理解对吗?不对的话请具体讲讲。谢谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
都是短连接吧,实现长连接需要用socket 或者netty
哥们去看下Http权威指南~~长连接,正常情况下是报文信息里面包含了Connection:close的时候 会关闭连接~~
http是单向链接
我翻看了部分源码,并没有发现HttpURLConnection使用了连接池,除非你使用的是同一个对象,你每次url.openConnection()就应该是创建了一个新的连接 当然或许是我查看的不仔细,或许还有其他实现 jdk版本1.7
如果需要引入连接池,可以使用httpclient 当然连接池也不是你理解的那样,池子里有很多鱼,你捞一条之后扔回去,再捞就不一定是这一条了,除非这个连接池是你自己实现的,捞鱼的逻辑你来写的,这样你爱怎么着就怎么着
回复
那java有实现http的keep-alive吗?
回复
貌似你问的问题中某些词语把我带到沟里去了,我再研究研究
回复
经过抓包,的确是在短时间内调用,是同一个tcp连接,工具使用wireshark 2.0.1,加入System.setProperty("http.keepalive","false");会开启多个连接
引用来自“maradona”的评论
不是,不一定
哥F12才把你的问题看全