一、背景及定义背景HTTP协议有一个缺陷:只能由客户端向服务器发送请求,服务器返回查询结果才能进行通信。服务端不可能主动向客户端推送信息。这种单向请求的特性,如果服务端有持续的状态变化,客户端要知道就会很麻烦。我们只能使用Ajax轮询:每隔一段时间,发送一个查询,看看服务器是否有新信息。轮询效率低下并且浪费资源(因为您必须保持连接,或者HTTP连接始终打开)。WebSocket最大的特点就是服务端可以主动向客户端推送信息,解决了轮询带来的同步延迟问题。由于WebSocket只需要一次HTTP握手,服务器可以保持与客户端的通信直到连接关闭,解决了服务器重复解析HTTP协议的问题,减少了资源开销。为了建立WebSocket连接,客户端浏览器首先要向服务器端发起HTTP请求。这个请求不同于通常的HTTP请求,它包含一些额外的头信息。附加的头信息“Upgrade:WebSocket”表明这是一个应用协议。对于升级后的HTTP请求,服务器会解析附加的头信息,然后生成响应消息返回给客户端。客户端和服务端之间的WebSocket连接建立起来,双方可以通过这个连接通道自由的传递信息,连接会一直持续到客户端或者服务端其中之一主动关闭连接。定义WebSocket是HTML5提供的一种协议,用于在单个TCP连接上进行全双工通信。数据通信的三种解释:1.单工通信只有一个方向的通信,反方向没有交互,只需要一个通道。如:Broadcast2.半双工通信(双向交替通信)通信双方都可以发送或接收消息,但任何一方都不能同时发送和接收。需要两个通道。如:对讲机3、全双工通信(双向同时通信)通信双方可以同时收发信息,也需要两个信道。如:打电话。特点(1)基于TCP协议,服务器端实现相对容易。(2)与HTTP协议有很好的兼容性。默认的端口也是80和443,而且握手阶段使用的是HTTP协议,所以在握手的时候不容易屏蔽,可以通过各种HTTP代理服务器。(3)数据格式比较轻,性能开销小,通信效率高。(4)可以发送文本或二进制数据。(5)没有同源限制,客户端可以和任何服务器通信。(6)协议标识符为ws(如果加密则为wss),服务器URL为URL。ws://example.com:80/some/path2.用于创建WebSocket对象。letSocket=newWebSocket(url,[protocol]);第一个参数url指定连接的URL。第二个参数protocol是可选的,它指定了可接受的子协议。WebSocket属性属性说明Socket.readyState只读属性readyState表示连接状态Socket.bufferedAmount只读属性bufferedAmount已被send()排队等待发送,但尚未发送的UTF-8文本字节数已经发送了。只读属性readyState表示连接状态,可以是以下值:0-表示连接还没有建立。1-表示已建立连接并且可以进行通信。2-表示连接正在关闭。3-表示连接已关闭或无法打开连接。WebSocket事件事件事件处理器说明openSocket.onopen客户端从服务器接收数据时触发messageSocket.onmessageerrorSocket.onerror发生通信错误时触发closeSocket.onclose连接关闭时触发WebSocket方法方法方法说明Socket.send()Connect发送数据Socket.close()关闭连接WebSocket示例//打开一个websocketletws=newWebSocket("wss://echo.websocket.org");ws.onopen=function(evt){//WebSocket已连接上,使用send()方法发送数据console.log("Connectionopen...");ws.send("HelloWebSockets!");};ws.onmessage=function(evt){console.log("ReceivedMessage:"+evt.data);ws.close();};ws.onclose=function(evt){console.log("连接关闭。");};参考文章:http://www.ruanyifeng。com/blo...参考文章:https://www.runoob.com/html/h...
