WebSocket 使用

4 minute read

WebSocket 封装

WebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信,位于OSI模型的应用层。

WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。

WebSocket协议规范将ws(WebSocket)和wss(WebSocket Secure)定义为两个新的统一资源标识符(URI)方案,分别对应明文和加密连接。

 1let websock = null
 2let messageCallback = null   // callback message important !!!!
 3let errorCallback = null
 4let wsUrl = ''
 5 
 6// 接收ws后端返回的数据
 7function websocketonmessage (e) {
 8  messageCallback(JSON.parse(e.data))
 9}
10 
11/**
12 * 发起websocket连接
13 * @param {Object} agentData 需要向后台传递的参数数据
14 */
15function websocketSend (agentData) {
16  // 加延迟是为了尽量让ws连接状态变为OPEN  
17  setTimeout(() => {
18    // 添加状态判断,当为OPEN时,发送消息
19    if (websock.readyState === websock.OPEN) { // websock.OPEN = 1
20      // 发给后端的数据需要字符串化
21      websock.send(JSON.stringify(agentData))
22    }
23    if (websock.readyState === websock.CLOSED) { // websock.CLOSED = 3
24      console.log('websock.readyState=3')
25      console.error('ws连接异常,请稍候重试')
26      errorCallback()
27    }
28  }, 500)
29}
30 
31// 关闭ws连接
32function websocketclose (e) {  
33  // e.code === 1000  表示正常关闭。 无论为何目的而创建, 该链接都已成功完成任务。
34  // e.code !== 1000  表示非正常关闭。
35  if (e && e.code !== 1000) {
36    console.error('ws连接异常,请稍候重试')
37    errorCallback()
38  }
39}
40// 建立ws连接
41function websocketOpen (e) {
42  // console.log('ws连接成功')
43}
44 
45// 初始化weosocket
46function initWebSocket () {
47  if (typeof (WebSocket) === 'undefined') {
48    console.error('您的浏览器不支持WebSocket,无法获取数据')
49    return false
50  }
51 
52  const token = 'JWT=' + getToken()
53  // ws请求完整地址
54  const requstWsUrl = wsUrl + '?' + token
55  websock = new WebSocket(requstWsUrl)
56
57  websock.onmessage = function (e) {
58    websocketonmessage(e)   // callback message important !!!!!!!
59  }
60  websock.onopen = function () {
61    websocketOpen()
62  }
63  websock.onerror = function () {
64    console.error('ws连接异常,请稍候重试')
65    errorCallback()
66  }
67  websock.onclose = function (e) {
68    websocketclose(e)
69  }
70}
71 
72/**
73 * 发起websocket请求函数
74 * @param {string} url ws连接地址
75 * @param {Object} agentData 传给后台的参数
76 * @param {function} successCallback 接收到ws数据,对数据进行处理的回调函数
77 * @param {function} errCallback ws连接错误的回调函数
78 */
79export function sendWebsocket (url, agentData, successCallback, errCallback) {
80  wsUrl = url
81  initWebSocket()
82  messageCallback = successCallback   // callback message important !!!!!!!
83  errorCallback = errCallback
84  websocketSend(agentData)
85}
86
87/**
88 * close websocket function
89 */
90export function closeWebsocket () {
91  if (websock) {
92    websock.close() 
93    websock.onclose() 
94  }
95}

参考:
封装websocket请求—–vue项目实战 回调函数