前言
在涉及到网络层面的相关内容时,不免会联系到 HTTP、TCP、WebSocket
等,但相信大部分人都并不是很清楚其中的一些关系和概念,特别是需要你去做语言表述时,网上有不少优秀的资料和文章,但知识仍需要自己去消化和总结,于是有了本文!!!
本文的核心内容就是 WebSocket
,主要从以下几个方面来进行介绍和实践:
- 是什么
WebSocket
(what) - 为什么需要
WebSocket
(why) WebSocket
和HTTP
的关系WebSocket
的使用场景 (when / where)WebSocket
实现简易聊天室(how)
吾乃 WebSocket
为了更好的解释 WebSocket 是什么,就需要一个熟悉且常用的东西来作为对比参考,它就是 HTTP。
HTTP
在大多数项目都会使用 HTTP 协议来实现前后端交互,而 HTTP 协议又是基于 TCP 协议来建立连接的,它们的关系是大致如下:
全双工 & 半双工
所谓 全双工 指的是发送端和接收端是可以 随时(包含同一时刻)
向对方发送消息进行通信,而 半双工 指的是发送端和接收端是也可以向对方发送消息进行通信,但是 同一时刻
只能有一方进行发送动作。
我们常用 HTTP1.1
协议就属于 半双工,即服务端不具备主动推送数据资源给客户端的能力,当服务端需要推送数据给客户端时,必须要客户端先发起一个请求,这也被称为 请求-响应 模型。
长轮询 & 服务端推送
由于 HTTP1.1
协议并不支持服务端主动向客户端发送数据消息,但实际需求又有需要实现这样的功能,比如扫码登录:
基于 请求-响应 模型如果我们需要服务端的消息数据,就必须先向服务端发送对应的查询请求,因此只要每隔一段时间向服务器发起查询请求,在根据响应结果决定是继续下一步操作,还是继续发起查询。
但这个查询请求是需要设定时间间隔,而时间间隔可结合 HTTP
请求超时时间来得出,毕竟如果一直发送查询请求,就会得到很多无意义的查询请求和响应结果。
上述在用户无感知下实现 服务端推送 功能的方案,其实就是所谓的 长轮询。
WebSocket
HTTP & 超文本
前面我们知道了 HTTP1.1 是 半双工,而 HTTP 是基于 TCP 的,然后 TCP 是 全双工 的,也就是说 HTTP1.1 中根本没用到 TCP 的 全双工 的能力,这是为啥?
早期 HTTP(超文本传输协议)
主要目的就是传输超文本,因为当时网络上绝大多数的资源都是纯文本,许多通信协议也都使用纯文本,因此 HTTP 在设计上不可避免地受到了时代的限制。
基于 TCP 的新协议
由于 HTTP
存在早期设计上的限制,因此需要一种新的基于 TCP
实现 全双工通信 的协议,而这个协议就是 WebSocket
。
WebSocket 其中的 Socket 其实并不是一个协议,它是为了方便使用 TCP 或 UDP 而抽象出来的一层,是位