长短轮询 相对于 客户端动作来讲是没有区别的,都是不停的去请求,区别在于后端的反应和前端的行为。(由于都比较占用服务端资源,就不说这些缺点了)
短轮询 是前端不停的请求,后端有没有数据都会返回,前端拿到的是否为空数据也都继续请求,因此,前端的数据不太好。
长轮询 也是前端不停的请求,后端去判断 有数据返回 ,之后 前端继续请求,没有数据 ,后端就把进程挂起,在前端也就是超时,超时后 前端继续请求,这样,前端获取的数据都是正常的。
长短连接 其实指的是 http1.0 到 1.1 升级的新特性,
HTTP/1.0 版的主要缺点是,每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。
TCP连接的新建成本很高,因为需要客户端和服务器三次握手,并且开始时发送速率较慢(slow start)。所以,HTTP 1.0版本的性能比较差。随着网页加载的外部资源越来越多,这个问题就愈发突出了。
为了解决这个问题,有些浏览器在请求时,用了一个非标准的Connection
字段。
Connection: keep-alive
这个字段要求服务器不要关闭TCP连接,以便其他请求复用。服务器同样回应这个字段。
Connection: keep-alive
一个可以复用的TCP连接就建立了,直到客户端或服务器主动关闭连接。
1.1 版的最大变化,就是引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive
。现在我们用的都是1.1版本的http,默认长连接。
客户端和服务器发现对方一段时间没有活动,就可以主动关闭连接。不过,规范的做法是,客户端在最后一个请求时,发送Connection: close
,明确要求服务器关闭TCP连接。
长短轮询和长短连接的区别
第一个区别是决定的方式,一个TCP连接是否为长连接,是通过设置HTTP的Connection Header来决定的,而且是需要两边都设置才有效。而一种轮询方式是否为长轮询,是根据服务端的处理方式来决定的,与客户端没有关系。
第二个区别就是实现的方式,连接的长短是通过协议来规定和实现的。而轮询的长短,是服务器通过编程的方式手动挂起请求来实现的。