设计模式和HTTP的区别
HTTP是基于Client/Server模式的,CS模式下的后端所以操作均时被动的和同步的,这也是基于HTTP请求是无法实现真正的后端主动通知前端的原因所在。
所以要真正思路主动通知,则需要放弃CS模式,实现真正的全双工通信。此时是事件驱动的异步通信。
轮询的实现方式
AJAX轮询(Long poll)本质上仍然是基于CS模式的,后端仍然无法主动通知前端,实现基本思路就是前端(client)定时发送HTTP请求询问后端有无消息。
Websocket
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。WebSocket是类似Socket的TCP长连接通讯模式。一旦WebSocket连接建立后,后续数据都以帧序列的形式传输。在客户端断开WebSocket连接或Server端中断连接前,不需要客户端和服务端重新发起连接请求。在海量并发及客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实时性优势明显。
WebSocket HANDSHAKING /path/1 [192.168.56.1:60398]# 握手
WebSocket CONNECT /path/1 [192.168.56.1:60398]# 建立连接
WebSocket DISCONNECT /path/1 [192.168.56.1:60398]# 断开
Js websocket api
var ws = new WebSocket("ws://localhost:8080");
//申请一个WebSocket对象,参数是服务端地址,同http协议使用http://开头一样,WebSocket协议的url使用ws://开头,另外安全的WebSocket协议使用wss://开头
ws.onopen = function(){
//当WebSocket创建成功时,触发onopen事件
console.log("open");
ws.send("hello")