Websocket
一、认识
由于 HTTP
存在一个明显的弊端(消息只能有客户端推送到服务器端,而服务器端不能主动推送到客户端),导致如果服务器如果有连续的变化,这时只能使用轮询,而轮询效率过低,并不适合。于是 WebSocket
被发明出来。 WebSocket
是一种在 Web
应用程序中实现双向通信的协议。与传统的 HTTP
请求-响应模式不同, WebSocket
提供了持久连接, 使服务器能够主动向客户端推送数据, 而不需要客户端发起请求。WebSocket
优势如下
-
双向通信:WebSocket 允许客户端和服务器之间建立持久连接,并通过这个连接进行双向通信。客户端和服务器可以随时发送消息给对方,实现实时的数据传输。
-
实时性:相比传统的 HTTP 请求-响应模式,WebSocket 具有更低的延迟和更高的实时性。服务器可以立即将数据推送给客户端,而不需要等待客户端的请求。
-
协议标识符:WebSocket 使用 ws://(非加密)或 wss://(加密)作为协议标识符,用于建立与服务器的连接。
-
较少的控制开销:WebSocket 的协议控制数据包头部较小,不需要携带完整的头部信息,减少了数据传输的开销。
-
支持文本和二进制数据:WebSocket 不仅可以传输文本数据,还可以传输二进制数据,使得它适用于各种类型的应用场景。
-
支持扩展:WebSocket 协议定义了扩展机制,允许用户自定义扩展或实现自定义的子协议,例如压缩算法、认证机制等。
-
无跨域问题:WebSocket 协议不存在跨域限制,可以轻松地在不同域名下进行通信。
二、状态
WebSocket
对象中的 readyState
属性有四种状态:
-
0
: 表示正在连接 -
1
: 表示连接成功,可以通信了 -
2
: 表示连接正在关闭 -
3
: 表示连接已经关闭,或者打开连接失败
三、断线重连
心跳就是客户端定时的给服务端发送消息,证明客户端是在线的, 如果超过一定的时间没有发送则就是离线了。
3.1 如何判断在线离线?
当客户端第一次发送请求至服务端时会携带唯一标识、以及时间戳,服务端到db
或者缓存去查询改请求的唯一标识,如果不存在就存入db
或者缓存中,第二次客户端定时再次发送请求依旧携带唯一标识、以及时间戳,服务端到db
或者缓存去查询改请求的唯一标识,如果存在就把上次的时间戳拿取出来,使用当前时间戳减去上次的时间,得出的毫秒秒数判断是否大于指定的时间,若小于的话就是在线,否则就是离线;
四、WebSocket 与 HTTP 的联系
-
WebSocket
和HTTP
都是一样基于 **TCP
**的,都是可靠性传输协议。都是应用层协议。 -
HTTP
是半双工通信,同一时刻数据是单向流动的,客户端向服务端请求数据->单向,服务端向客户端返回数据->单向。服务器不能主动的推送数据给客户端。虽然HTTP/2也具备服务器推送功能,但HTTP/2 只能推送静态资源,无法推送指定的信息。HTTP是非持久的协议,客户端想知道服务端的处理进度只能通过不停地使用 Ajax进行轮询或者采用 long poll 的方式来,但是前者对服务器压力大,后者则会因为一直等待Response造成阻塞。虽然http1.1默认开启了keep-alive长连接保持了这个TCP通道使得在一个HTTP连接中,可以发送多个Request,接收多个Response,但是一个request只能有一个response。而且这个response也是被动的,不能主动发起。 -
WebSocket
是独立于HTTP
的双工通信协议,让服务器端可以主动向客户端发送信息,使得浏览器具备了实时双向通信的能。WebSocket协议也需要通过已建立的TCP连接来传输数据。具体实现上是通过http协议建立通道,然后在此基础上用真正的WebSocket协议进行通信,所以WebSocket协议和http协议是有一定的交叉关系的。WebSocket 是一个持久化的协议。