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
原文:https://www.cnblogs.com/ashen1999/p/12693551.html