如何用java实现HTTP长连接,第1张

咱的理解:

当应用程序读取完响应体内容后或者调用 close() 关闭了URLConnectiongetInputStream()返回的流,

JDK中的HTTP协议句柄将关闭连接,并将连接放到连接缓存中。下次获取URLConnection示例,并获取InputStream流时,会再次使用之前打开的TCP连接。

也就是说:

public static String sendPost(String url, String param) { String result = ""; try { URL httpurl = new URL(url); HttpURLConnection httpConn = (HttpURLConnection) httpurlopenConnection(); httpConnsetDoOutput(true); httpConnsetDoInput(true); PrintWriter out = new PrintWriter(httpConngetOutputStream()); outprint(param); outflush(); outclose(); BufferedReader in = new BufferedReader(new InputStreamReader(httpConngetInputStream())); String line; while ((line = inreadLine()) != null) { result += line; } inclose(); } catch (Exception e) { Systemoutprintln("没有结果!" + e); } return result; }

咱在间隔较短的时间内调用上面的方法(连接的地址不一样,但还是同一个服务器同一个项目),用的是同一个TCP连接。咱这么理解对吗?不对的话请具体讲讲。谢谢。

目前web上的消息通讯方式主要有以下几种。

轮询,长连接,websocket

轮询:隔一段时间访问服务器,服务器不管有没有新消息都立刻返回。

长连接:页面向服务器发出请求,由服务器决定什么时候返回。(如果有新消息则立刻返回,没有的话就保持连接,直到有新消息才返回)

websocket:类似Java Socket,由Http请求模拟实现的socket。

要实现长连接的关键就是: 由服务器端决定什么时候返回数据。比如在servlet中。

doGet(){

Threadsleep(30000);

return

}

这就是一个长连接的例子,只是没有任何意义而已。

你要做的就是在doGet中阻塞住,

while(!hasNewMsg){

sleep(500)

}

return newMsg

当然你的ajax超时时间要设置长一点。

如果可以的话,最好可以使用websocket。

公告又不是很多 又所有人都是一样的 为什么每次都读数据库 你直接拿出来放在服务器里面 请求过来了直接将值给他就行了 公告更新由服务器管理 如果还嫌ajax占客户端资源的话 就调大请求间隔吧 又不是需要即时性很高的东西

短连接

连接->传输数据->关闭连接 

比如HTTP是无状态的的短链接,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。

具体就是:浏览器client发起并建立TCP连接 -> client发送HttpRequest报文 -> server接收到报文->server handle并发送HttpResponse报文给前端,发送完毕之后立即调用socketclose方法

->client接收response报文->client最终会收到server端断开TCP连接的信号->client 端断开TCP连接,具体就是调用close方法。

也可以这样说:短连接是指SOCKET连接后,发送接收完数据后马上断开连接。

因为连接后接收了数据就断开了,所以每次数据接受处理不会有联系。 这也是HTTP协议无状态的原因之一。

长连接

连接->传输数据->保持连接 -> 传输数据-> ->直到一方关闭连接,多是客户端关闭连接。 

长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。

HTTP在短链接和长连接上的选择:

HTTP是无状态的 ,也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。

如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话

HTTP11和HTTP10相比较而言,最大的区别就是增加了持久连接支持(貌似最新的HTTP11 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的。

如果浏览器或者服务器在其头信息加入了这行代码 Connection:keep-alive 

TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了带宽。

实现长连接要客户端和服务端都支持长连接。

什么时候用长连接,短连接?

长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。

每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。

例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。

总之,长连接和短连接的选择要视情况而定。

来源

三次握手流程:

为何不采用两次握手

四次挥手流程:

为何需要进入 TIME-WAIT 等待 2 MSL 时间才进入close状态

为何握手需要三次而挥手需要四次

三次握手和四次挥手简单举例

三次握手

四次挥手

报文格式

来源

HTTP的请求报文包括: 请求行(request line) 请求头部(header) 空行 请求数据(request data) 四个部分组成。

来源

请求行 包括: 请求方法,URL(包括参数信息),协议版本这些信息(GET /admin_ui/rdx/core/images/closepng HTTP/11)

请求头部(Header) 是一个个的key-value值,比如

请求数据 :GET方法没有携带数据, POST方法会携带一个body

HTTP的响应报文包括:状态行,响应头,空行,数据(响应体)

来源

状态行 包括:HTTP版本号,状态码和状态值组成。

响应头 类似请求头,是一系列key-value值

空白行:同上,响应报文也用空白行来分隔header和数据

响应体 :响应的data,本例中是一段HTML

数字中的第一位指定了响应类别,后两位无分类,响应类别有一下5种:

状态码分类表

2xx (3种)

3xx (5种)

4xx (4种)

5xx (2种)

11 长连接(Persistent Connection) HTTP11支持长连接和请求的流水线处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP11中默认开启长连接keep-alive,一定程度上弥补了HTTP10每次请求都要创建连接的缺点。HTTP10需要使用keep-alive参数来告知服务器端要建立一个长连接。

12 节约带宽 HTTP10中存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能。HTTP11支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,客户端接收到100才开始把请求body发送到服务器;如果返回401,客户端就可以不用发送请求body了节约了带宽。

13 HOST域 在HTTP10中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname),HTTP10没有host域。随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP11的请求消息和响应消息都支持host域,且请求消息中如果没有host域会报告一个错误(400 Bad Request)。

14缓存处理 在HTTP10中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP11则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。

21 多路复用

HTTP20使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP11大了好几个数量级。HTTP11也可以多建立几个TCP连接,来支持处理更多并发的请求,但是创建TCP连接本身也是有开销的。

来源

22 头部压缩

在HTTP11中,HTTP请求和响应都是由状态行、请求/响应头部、消息主体三部分组成。一般而言,消息主体都会经过gzip压缩,或者本身传输的就是压缩过后的二进制文件,但状态行和头部却没有经过任何压缩,直接以纯文本传输。随着Web功能越来越复杂,每个页面产生的请求数也越来越多,导致消耗在头部的流量越来越多,尤其是每次都要传输UserAgent、Cookie这类不会频繁变动的内容,完全是一种浪费。

HTTP11不支持header数据的压缩,HTTP20使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。

HTTP是明文传输,整个过程完全透明,任何人都能够在链路中截取、修改或者伪造请求,数据不具有可靠性。因此有了https

HTTPS是身披SSL外壳的HTTP。HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。

参考:

https://juejinim/entry/5981c5df518825359a2b9476

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 如何用java实现HTTP长连接

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情