HTML5 WebSocket
-
允许服务端主动向客户端发送数据
-
浏览器和服务器只需完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输
-
节省服务器资源和带宽,实现更实时的通讯
创建websocket
-
第一个参数为目标路径
-
第二个参数为可选参数,可以是字符串或数组,用来表示子协议,这样可以让一个服务器实现多种
websocket
子协议
var ws = new WebSocket([url],[option])
实例对象的方法
-
send()
:接收一个String|ArrayBuffer|Blob
数据,发送到客户端 -
close()
:客户端主动断开连接-
第一个参数可选,为关闭状态号,默认1000
-
第二个参数可选,字符串类型,表示断开原因
-
表示连接状态的常量
-
WebSocket.CONNECTING
0 连接还没开启 -
WebSocket.OPEN
1 连接已开启并准备好进行通信 -
WebSocket.CLOSING
2 连接正在关闭的过程中 -
WebSocket.CLOSED
3 连接已关闭,或者连接无法建立 -
通过
readyState
属性来判断当前状态
事件监听
-
open
:连接已建立-----OPEN -
message
:接收到消息,回调函数中收到messageEvent
数据,其中messageEvent.data
为消息信息 -
closed
:连接关闭--CLOSED -
error
:建立和连接过程中发生错误
事件监听方式和数据解析
-
可以对
on[事件]
直接赋值-
ws.onopen = function(){alert('连接成功')}
-
-
也可以使用
addEventListener
监听事件-
ws.addEventListener('open', funtion(){})
-
-
不论是服务端还是客户端,其接收到的都是序列化后的字符串,很多时候需要通过
JSON.parse(e.data)
解析
连接稳定性
-
某些情况下出现断开连接或连接出错时,需要在
error
或open
中进行监听非正常断开并重连 -
在
open
后开启一个定时任务去判断当前readyState
,在出现异常情况下尝试重连
心跳
-
WebSocket
中规定了心跳机制,一方通过发送ping(opcode 0x9)
消息给另一方,另一方收到ping
后应尽可能快的返回pong(0xA)
-
用来检测连接的对方在线状态。因此如果没有心跳,那么没有办法判断对方的连接状态,就会断开连接
建连阶段
-
借助于
HTTP
-
部分请求头意义
-
Connection:Upgrade
: 表示要升级协议 -
Upgrade:websocket
: 表示要升级到websocket
协议 -
Sec-WebSocket-Version
:websocket
版本 -
Sec-WebSocket-Key
:是一个Base64 encode
的值,由浏览器随机生成,与服务端响应头中的Sec-WebSocket-Accept
配套
-
-
部分响应头意义
-
状态码101 :表示切换协议
-
Upgrade
和Connection
-