webSocket

57 阅读2分钟

webSocket是啥?

提供浏览器和服务器之间建立持久链接来交换数据。即时通信

实际业务场景

在商城端,参与直播活动的商品,商品活动状态更改,服务器需要主动发送消息通知浏览器。

例如:商品的开售状态。若商品未手动开售,不支持立即购买,若已设置手动开售,此时状态同步需要到商城端,表示该商品已开售,可以按直播价购买。

webSocket前,先来请2位选手入场,就是这两货:轮询、长轮询。

1. 轮询:实现方式:还是请求** / 响应(效率低,基本不用**)

浏览器定时给后端发送请求。每隔1s发一次。就像下面这样:

C:hi,服务器,有消息发给我吗?
S:暂时没有哦。1s后

C:hi,服务器,有消息发给我吗?
S:暂时没有哦。

……

C:hi,服务器,有消息发给我吗?
S:有的,呐,这是你要的消息包裹。  

轮询  

优点:后端程序编写比较容易。

缺点:浪费服务器和客户端的资源,发送请求越多,加大服务端压力。 Out!^_^
实例:适于小型应用

 

2. 长轮询:实现方式:队列 +ajax(兼容性好)

服务端给每个客户端建立队列,让浏览器通过ajax朝服务端要数据,去各自的队列中获取

如果没有数据则会阻塞但是不会一直阻塞,比如阻塞你30秒,还没有数据则返回,然后让客户端浏览器再次发送请求数据的请求

 

C:hi,服务器,砸门连接通信了哦~
S:挂起~~~

……

S:hi,client,呐,这是你要的消息包裹。

http长轮询

优点:在无消息的情况下不会频繁的请求,节省了网络流量,解决了服务端一直疲于接受请求的窘境

缺点:连接挂起也会导致资源的浪费。 Out!^_^

实例:WebQQ、Hi网页版、Facebook IM

 

两者:服务器不会主动推送信息。

 

3. 长连接(SSE)这个未实验,待续……

 

4. webSocket

image.png

const url = `${protocol === 'https:' ? 'wss' : 'ws'}://${hostname}/mall/api/ws/liveActivity/Websocket`;

this.socket = new WebSocket(url)

这是new WebSocket() 发出的请求的浏览器 header 示例。

  image.png

1. webSocket事件

事件事件处理程序描述
openSocket.onopen连接建立时触发
messageSocket.onmessage客户端接收服务端数据时触发
errorSocket.onerror通信发生错误时触发
closeSocket.onclose连接关闭时触发

2. webSocket方法

方法描述
Socket.send()使用连接发送数据
Socket.close()关闭连接

js封装websocket,网上看到一个比较好的例子:

gitee.com/xfwinne/web…

总结:

性能方面考虑,WebSocket > 长连接SSE > 长轮询 > 短轮询

参考:
zh.javascript.info/websocket
zh.javascript.info/long-pollin…
blog.csdn.net/sugelachao/…
t.zoukankan.com/KrisYzy-p-1…