Aiden's blog Aiden's blog
首页
  • 前端文章

    • JavaScript
    • Vue
  • 学习笔记

    • JavaScript教程
    • JavaScript高级程序设计
    • ES6 教程
    • Vue
    • Vue3.0
    • React
    • TypeScript 从零实现 axios
    • Git
    • TypeScript
    • JS设计模式总结
    • 小程序
    • 小程序云开发
    • Echarts
    • 微前端
    • H5
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 搜索引擎
  • ES系列
  • 经典面试题
  • 知识点总结
  • uni-app
  • 算法
  • Vue3实战
  • 小程序chatgpt
  • 小程序配网流程
  • 程序WIFI配网
  • 小程序WebSocket
  • H5 WebSocket
  • H5 TTS
  • Vue3实现OSS存储
  • 大文件分片上传
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Aiden Wu

前端界的小学生
首页
  • 前端文章

    • JavaScript
    • Vue
  • 学习笔记

    • JavaScript教程
    • JavaScript高级程序设计
    • ES6 教程
    • Vue
    • Vue3.0
    • React
    • TypeScript 从零实现 axios
    • Git
    • TypeScript
    • JS设计模式总结
    • 小程序
    • 小程序云开发
    • Echarts
    • 微前端
    • H5
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 搜索引擎
  • ES系列
  • 经典面试题
  • 知识点总结
  • uni-app
  • 算法
  • Vue3实战
  • 小程序chatgpt
  • 小程序配网流程
  • 程序WIFI配网
  • 小程序WebSocket
  • H5 WebSocket
  • H5 TTS
  • Vue3实现OSS存储
  • 大文件分片上传
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 技术文档

  • GitHub技巧

  • Nodejs

  • 博客搭建

  • 搜索引擎

  • ES系列

  • 经典面试题

  • 知识点总结

  • uni-app

  • 算法

  • Vue3实战

  • 小程序chatgpt

  • 小程序WIFI配网

  • 小程序配网流程

  • 小程序WebSocket

  • H5 WebSocket

    • H5 WebSocket
      • 初始化WebSocket
      • 连接WebSocket
      • 监听WebSocket连接打开事件
      • 监听WebSocket关闭事件
      • 监听WebSocket错误事件
      • 关闭WebSocket连接
      • 尝试重连WebSocket
      • 向后端发送命令
      • 心跳检测
  • H5 TTS

  • Vue3实现OSS存储

  • 大文件分片上传

  • 技术
  • H5 WebSocket
wushengxin
2024-08-05
目录

H5 WebSocket

# 小程序WebSocket

  1. websocket服务,云托管底层会有健康检查尝试连接,属于正常的请求;你可以通过请求的header进行识别进行过滤,正常的websocket连接请求会带 Connection: Upgrade 、Upgrade: websocket 这两个header。可根据header的差异在代码中过滤请求。
  2. websocket目前只支持wss方式连接。

# 初始化WebSocket

// 小程序与设备建立WebSocket连接
const initWebSocket = () => {
  websocketConnect()
}
1
2
3
4

# 连接WebSocket

// WebSocket是否处于连接状态
let socketOpen = ref(false)
let websockSign = ref(null)
// 连接WebSocket
const websocketConnect = () => {
    const url = `xxx`
    websockSign.value = new WebSocket(url) // WebSocket 服务器地址

    if (
      websockSign.value.readyState !== null &&
      websockSign.value.readyState == 1
    ) {
      //避免重复链接
      console.log('websocket 连接已存在...')
    } else {
      websockSign.value.onopen = (e) => websocketOnopen(e)
      websockSign.value.onerror = (e) => websocketOnerror(e)
      websockSign.value.onmessage = (e) => websocketOnmessage(e)
      websockSign.value.onclose = (e) => websocketOnclose(e)
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 监听WebSocket连接打开事件

// 监听WebSocket连接打开事件
const websocketOnopen = () => {
  console.log('WebSocket连接成功')
  if (!socketOpen.value && chatText.value) {
    socketOpen.value = true
    saveAndSendChat()
  } else {
    socketOpen.value = true
  }
}
1
2
3
4
5
6
7
8
9
10

# 监听WebSocket关闭事件

// 监听WebSocket关闭事件
const websocketOnclose = () => {
  if (res?.code !== 1000) {
    console.log('WebSocket 非正常断开重连...')
    socketOpen.value = false
    reConnect()
  }
}
1
2
3
4
5
6
7
8

# 监听WebSocket错误事件

// 监听WebSocket错误事件
const websocketOnerror = () => {
  if (res?.code !== 1000) {
    console.log('WebSocket 非正常断开重连...')
    socketOpen.value = false
    reConnect()
  }
}
1
2
3
4
5
6
7
8

# 关闭WebSocket连接

// 关闭WebSocket连接
const closeWebSocket = () => {
  uni.closeSocket({
    code: 1000,
    reason: 'close reason from client',
    success: (res) => {},
    fail: (error) => {}
  })
}
1
2
3
4
5
6
7
8
9

# 尝试重连WebSocket

// WebSocket重连状态
let lockReconnect = ref(false)
// 重连WebSocket定时器
let websocketTimer = ref(null)
// 尝试重连WebSocket
const reConnect = () => {
  if (lockReconnect.value) return
  reConnect.value = true
  // 停止发送心跳
  if (heartbeatTimer.value) {
    clearTimeout(heartbeatTimer.value)
    heartbeatTimer.value = null
  }
  // 没连接上会一直重连,设置延迟避免请求过多
  websocketTimer.value = setTimeout(() => {
    console.log('尝试重连...')
    initWebSocket()
    // WebSocket断开时需要重新请求设备控件状态
    getDevices()
    lockReconnect.value = false
    clearTimeout(websocketTimer.value)
  }, 5000)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 向后端发送命令

// 向后端发送命令(发送数据,需要先uni.connectSocket,并在uni.onSocketOpen回调之后才能发送)
const sendMsg = (type) => {
  const params = {
    token,
    serial_no
  }
  // 处理发送数据:连接WebSocket发送token、serial_no
  let data = null
  if (type === 'heartbeat') {
    data = 'heartbeat'
  } else {
    data = JSON.stringify(params)
  }
  console.log('发送的数据:', data)
    
  // 开启心跳检测
  heartbeatCheck()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 心跳检测

// 心跳检测间隔(单位秒):WebSocket默认一分钟内未通信会自动断开连接
let timeoutNumber = 30
// 心跳检查定时器
let heartbeatTimer = ref(null)
// 开启心跳检测
const heartbeatCheck = () => {
  if (heartbeatTimer.value === null) {
    heartbeatTimer.value = setTimeout(() => {
      console.log('心跳检测')
      sendMsg('heartbeat')
      clearTimeout(heartbeatTimer.value)
      heartbeatTimer.value = null
      heartbeatCheck()
    }, timeoutNumber * 1000)
  }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
编辑 (opens new window)
上次更新: 2024/08/05, 18:11:13
小程序WebSocket
H5 TTS

← 小程序WebSocket H5 TTS→

最近更新
01
大文件分片上传
08-05
02
Vue3实现OSS存储
08-05
03
H5 TTS
08-05
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Aiden Wu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×