由于 http 协议是单向的,以前若是服务器端有连续的变化须要通知客户端,只能经过客户端进行轮询(或者 long poll),可是轮询很是浪费资源,工程师们就发明了WebSocket。2011年成为国际标准,目前全部浏览器都已经支持了。
WebSocket 协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通讯——容许服务器主动发送信息给客户端。这是百度百科的定义,很是容易理解。服务端主动推送消息到客户端解决了一大痛点,也是使用WebSocket的最大缘由。
在 WebSocket API,浏览器和服务器只须要作一个握手的动做,而后,浏览器和服务器之间就造成了一条快速通道。二者之间就直接能够数据互相传送。html
一句话就是:持久化连接
相比于轮询和 long poll,WebSocket 带来的性能开销优点就是由于持久化连接。
简单说下轮询和 long poll,轮询就是每隔一段时间就请求,每次请求不管数据是否更新都要占据后台服务的资源,很是浪费,须要后台服务有很快的处理速度,long poll 就是发送请求后,直到服务器更新了才返回更新的信息,也很浪费,须要后台服务很好的处理高并发的能力。
对比一下,每条 http 请求须要通过 Nginx 转发到特定的后台服务,后台服务处理请求,并且由于是无状态的,每次都要解析头信息,搞的后台服务也很烦。而 WebSocket 与 Nginx 创建持久化连接后,后台服务与客户端通讯变得很是高效。Nginx 能力很强,保持这种持久化连接小菜一碟。node
示例:web
// Create WebSocket connection. const socket = new WebSocket('ws://localhost:8080'); // // Connection opened socket.addEventListener('open', function (event) { socket.send('Hello Server!'); }); // // Listen for messages socket.addEventListener('message', function (event) { console.log('Message from server', event.data); });
了解 WebSocket 的时候很容易接触到 Socket.IO,二者关系:Socket.IO 是 WebSocket 在 node.js 和客户端的一种实现,这么说也不许确,由于他会在没法使用 Websocket 的时候采用其余代替方案实现相似持久连接。
这样描述应该跟准确:Socket.IO 是创建 node.js服务端与客户端之间持久连接的一个框架,会优先采用 WebSocket 协议。
其接口简单容易理解,参考官方文档服务器