对 WebSocket 做了一个了解并记录,有理解不当的地方还望指出 😁😁
Why
Http 协议只能满足客户端发起请求的场景(单向请求),如果服务器有连续的状态变化,客户端要获知就非常麻烦。因此有了轮询,每隔一段时间就问一下服务器有没有信息,典型的场景是聊天室,但是轮询效率低下。当服务端数据发生改变时,希望服务端也能主动向客户端推送数据,因此又有了 websocket 协议
What
WebSocket 是一种网络通信协议,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,属于服务器推送技术的一种。
特点
- 协议标识
ws,加密的是wss - 兼容 HTTP 协议
- 建立在 TCP 协议之上
- 数据格式轻量
- 没有同源策略
- 可以发送文本/二进制数据(blob对象或Arraybuffer对象)
How
使用构造函数建立 WebSocket 实例,具体看 API 参考文档
客户端 API
WebSocket 构造函数、webSocket.readyState、webSocket.onopen、webSocket.onclose、webSocket.onmessage、webSocket.send、webSocket.bufferedAmount(还有多少数据没发送出去)、webSocket.onerror
基本是一些回调函数方法,有一些和 Ajax 的很像 🤔🤔,直接查 API,文章底部阮一峰老师的文章也有做介绍。
服务器端的实现
WebSocket 服务器:Websocketd
阮一峰老师的文章有做介绍,还没实操,仅做了解
WebSocket 与 Ajax的区别
本质不同
- Ajax 即异步 JavaScript 和 XML,是一种创建交互式网页的应用的网页开发技术
- websocket 是 HTML5 的一种新协议,
实现了浏览器和服务器的实时通信
生命周期不同
- websocket 是长连接,会话一直保持
- ajax 发送接收之后就会断开
适用范围
- websocket 用于前后端
实时交互数据 - ajax 非实时
发起人
- AJAX 客户端发起
- WebSocket
服务器端和客户端相互推送
长轮询和短轮询
WebSocket 是长轮询。具体比如在一个电商场景,商品的库存可能会变化,所以需要及时反映给用户,所以客户端会不停的发请求,然后服务器端会不停的去查变化,不管变不变,都返回,这个是短轮询。而长轮询则表现为如果没有变,就不返回,而是等待变或者超时(一般是十几秒)才返回,如果没有返回,客户端也不需要一直发请求,所以减少了双方的压力。