题图:fabio / Unsplash
最近忙的事情是个大数据相关的产品,需求的核心是全量、准确、实时。
从之前的数字货币交易所的开发过程中就不断接触到 WebSocket 这个概念,现在几乎也是每天都会听到,实在受不住似懂非懂良心的良心的煎熬,果断研究了一波,故有此文。
首先来看维基百科的解释:
WebSocket 是一种通信协议,可在单个 TCP 连接上进行全双工通信。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。
这么说吧,当你需要一个实时更新的页面时,WebSocket 就可以完美实现你的需求。
传统的 HTTP 协议是无状态的,每次发出请求时建立连接,收到回复时便会断开连接。如果使用 HTTP 协议来实现这个需求,就有下面两种方法可以考虑:
第一种是使用轮询的方式,在特定的时间间隔(如1秒)内向由浏览器向服务器发出 HTTP 请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
第二种使用 Comet 去做轮询,它的原理就是发送一个更新请求后,就一直占据着端口,等待服务器响应,直到服务器有数据返回了才会断开连接。反复发出请求,而且普遍采用的是长链接,比较浪费服务器资源。
当原有的技术没法办法很好解决问题时,新的技术就会出现。
在这种情况下,HTML5 定义了 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
Websocket 使用 ws 或 wss 的统一资源标志符,类似于 HTTPS,其中 wss 表示在 TLS之 上的Websocket。如:
ws://example.com/wsapiwss://secure.example.com/wsapi
Websocket 使用和 HTTP 相同的 TCP 端口,可以绕过大多数防火墙的限制。默认情况下,Websocket 协议使用 80 端口;运行在 TLS 之上时,默认使用 443 端口。
大多数浏览器都支持该协议,包括 Google Chrome、Firefox、Safari、Microsoft Edge、Internet Explorer 和 Opera。
基本上,总结起来:如果你想实现一个实时性很强的网页,或者想向网页及时推送一些信息,尽可能选择 WebSocket 吧。
那 WebSocket 有没有缺点呢?
IE7 / IE8 / IE9 等沙雕古董浏览器不支持 Websocket ,其他没有了。
然后我们其实再多想一些:Websocket 会使用一次 HTTP的 报文握手,在那之后便是 WebSocket 自身规定的方式进行通讯了。它是个在各种网站都可能被用到的协议。既然它常见,那么就安全。
还可以利用各种 CDN 服务,将你的 WebSocket 进行代理,而让真实的服务器 IP 隐藏在重重 CDN之后。哪怕真实的服务器 IP 消失了,你的服务也不会失效。
只能讲这么多了,剩下的请自行 Google 一下,关键词「Websocket + 小辣椒」。
写到这里思考了下,由于不支持外链,很多外有价值的内容没法展示出来,但是按照现在的策略,对小程序的跳转是没有限制的,因此我们可以在文章中自由插入 GitHub 仓库的小程序链接,方便访问仓库的详情提升阅读体验。
小辣椒-over-websocket
这个操作实在太机智了,值得点个在看。🤖