網站首頁 編程語言 正文
目錄
- 1,前言
- 2,代碼實現
- 3,使用
- 3.1,初始化
- 3.2,發送消息
- 3.3,接收消息
- 3.4,斷線重連
1,前言
最近在做IOT
的項目,里面有個小程序要用到webSocket
,借這個機會,封裝了一個uniapp小程序
適用的Socket
類,包括斷線重連,心跳檢測等等,具體實現如下。
2,代碼實現
class webSocketClass {
constructor(url, time) {
this.url = url
this.data = null
this.isCreate = false // WebSocket 是否創建成功
this.isConnect = false // 是否已經連接
this.isInitiative = false // 是否主動斷開
this.timeoutNumber = time // 心跳檢測間隔
this.heartbeatTimer = null // 心跳檢測定時器
this.reconnectTimer = null // 斷線重連定時器
this.socketExamples = null // websocket實例
this.againTime = 3 // 重連等待時間(單位秒)
}
// 初始化websocket連接
initSocket() {
const _this = this
this.socketExamples = uni.connectSocket({
url: _this.url,
header: {
'content-type': 'application/json'
},
success: (res) => {
_this.isCreate = true
console.log(res)
},
fail: (rej) => {
console.error(rej)
_this.isCreate = false
}
})
this.createSocket()
}
// 創建websocket連接
createSocket() {
if (this.isCreate) {
console.log('WebSocket 開始初始化')
// 監聽 WebSocket 連接打開事件
try {
this.socketExamples.onOpen(() => {
console.log('WebSocket 連接成功')
this.isConnect = true
clearInterval(this.heartbeatTimer)
clearTimeout(this.reconnectTimer)
// 打開心跳檢測
this.heartbeatCheck()
})
// 監聽 WebSocket 接受到服務器的消息事件
this.socketExamples.onMessage((res) => {
console.log('收到消息')
uni.$emit('message', res)
})
// 監聽 WebSocket 連接關閉事件
this.socketExamples.onClose(() => {
console.log('WebSocket 關閉了')
this.isConnect = false
this.reconnect()
})
// 監聽 WebSocket 錯誤事件
this.socketExamples.onError((res) => {
console.log('WebSocket 出錯了')
console.log(res)
this.isInitiative = false
})
} catch (error) {
console.warn(error)
}
} else {
console.warn('WebSocket 初始化失敗!')
}
}
// 發送消息
sendMsg(value) {
const param = JSON.stringify(value)
return new Promise((resolve, reject) => {
this.socketExamples.send({
data: param,
success() {
console.log('消息發送成功')
resolve(true)
},
fail(error) {
console.log('消息發送失敗')
reject(error)
}
})
})
}
// 開啟心跳檢測
heartbeatCheck() {
console.log('開啟心跳')
this.data = { state: 1, method: 'heartbeat' }
this.heartbeatTimer = setInterval(() => {
this.sendMsg(this.data)
}, this.timeoutNumber * 1000)
}
// 重新連接
reconnect() {
// 停止發送心跳
clearTimeout(this.reconnectTimer)
clearInterval(this.heartbeatTimer)
// 如果不是人為關閉的話,進行重連
if (!this.isInitiative) {
this.reconnectTimer = setTimeout(() => {
this.initSocket()
}, this.againTime * 1000)
}
}
// 關閉 WebSocket 連接
closeSocket(reason = '關閉') {
const _this = this
this.socketExamples.close({
reason,
success() {
_this.data = null
_this.isCreate = false
_this.isConnect = false
_this.isInitiative = true
_this.socketExamples = null
clearInterval(_this.heartbeatTimer)
clearTimeout(_this.reconnectTimer)
console.log('關閉 WebSocket 成功')
},
fail() {
console.log('關閉 WebSocket 失敗')
}
})
}
}
export default webSocketClass
3,使用
直接實例化封裝的socket
類,調用initSocket
初始化就行了,當收到消息的時候,會觸發全局$emit
事件,只需要使用$on
監聽message
事件就行。
3.1,初始化
我這邊在globalData
里面定義了socketObj
全局變量,在首頁onShow
生命周期里面判斷當前是否已經初始化了socket
實例,再進行操作。
home.vue
import WebSocketClass from '../../utils/webSocket'
const app = getApp()
onShow() {
// 如果已登陸,則啟用WebSocket
if (app.globalData.user && app.globalData.user.sToken) {
// 如果已經有sockt實例
if (app.globalData.socketObj) {
// 如果sockt實例未連接
if (!app.globalData.socketObj.isConnect) {
app.globalData.socketObj.initSocket()
}
} else {
// 如果沒有sockt實例,則創建
const data = app.globalData.user
const path = `/websocket/notify/${data.userId}`
app.globalData.socketObj = new WebSocketClass(
`${app.globalData.socketUrl}${path}?token=${data.userToken}&refreshToken=${data.sToken}`,
60
)
app.globalData.socketObj.initSocket()
}
}
}
3.2,發送消息
methods: {
sendMessage() {
const param = { value: '我是一個消息' }
app.globalData.socketObj.sendMsg(param)
}
}
3.3,接收消息
// 開啟監聽
onLoad() {
uni.$on('message', this.getMessage)
},
// 頁面卸載時取消監聽
onUnload() {
uni.$off('message', this.getMessage)
},
methods: {
// 接收到消息的回調
getMessage(msg) {
console.log(msg)
}
}
3.4,斷線重連
斷線會自動重連。
推薦測試工具:websokcet在線測試工具
原文鏈接:https://blog.csdn.net/pdd11997110103/article/details/125006717
相關推薦
- 2023-05-22 NumPy迭代數組的實現_python
- 2022-05-09 PyTorch實現線性回歸詳細過程_python
- 2023-06-13 C語言中函數返回值不一致問題_C 語言
- 2022-01-15 跨域系列之proxy代理,解決跨域的方法之一
- 2024-02-17 序列轉序模型及其pytorch實現
- 2022-11-05 Android?Jetpack組件中LifeCycle作用詳細介紹_Android
- 2022-06-10 docker-compose部署Yapi的方法_docker
- 2022-11-06 關于useEffect的第二個參數解讀_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支