「这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战」。
websocket 是什么
传统 http 请求,只能由客户端发起,服务端不能向客户端发起请求,这就导致了很多场景下灵活性较差。之前采用的方案为轮询,分为长轮询和短轮询。
- 长轮询:就是发请求后一直 pending,直到服务端要发送请求给客户端,客户端收到请求后立即再发送个请求
- 短轮询:每隔一段时间往客户端发一次请求,有没有结果服务端都立即返回 这两种方式缺点都很明显,所以要另起炉灶搞一个 websocket 协议。
websocket 是跟着 html5 定义的,为了能节省服务器资源和带宽且实现双工通信。首先注意的是 ws 也是在应用层,跟 http 一样,并且它和 http 协议再同一个端口,即 80 和 443。
ws 也是建立在 tcp 协议的基础上,因为 tcp 就是一个全双工协议,所以它可以底层满足 ws 的要求。
websocket 的优点如下:
- 连接后包数据较小
- 全双工协议,速度快,灵活
- 不同于 http 这个文本协议,ws 支持二进制,可以处理二进制内容
- 支持扩展
如何使用 websocket
首先我们需要构建 ws 对象:new WebSocket(url [, protocols]),url 表示连接的 url,后面的代表支持的子协议,因为 ws 支持扩展。
建立连接后,如果发送请求,可以通过构建出来的对象,调用send方法,将要传输的数据放进去;如果需要关闭连接,可以调用 close 方法。
那么如何处理收到的信息呢,可以通过以下几个事件实现:1.close;2. error;3. message;4. open,ws 成功的时候会触发。
ws 依赖于 http 协议的 10 1状态码进行握手。握手成功后连接可以从普通的 http 连接 upgrade 为一个websocket 连接。这样能够非常方便地利用现有的 http 协议基础设施