class _WebSocket {
//是否打开连接
isOpen = false
//全局的定时器
globalTimer = null
//存储task对象
socketTask = null
//连接socket
async connectSocket(
data = {},
linkMark, //连接标识
option = {}, //连接需要带的额外的参数
successFunc = null, //连接成功回调
errorFunc = null, //连接错误回调
receiveFunc = null, //接收到消息回调
closeFunc = null //连接关闭回调
) {
try {
//如果连接已存在并且已经打开就不再连接
if (this.socketTask && this.isOpen) {
return
}
//获取头 await getAccessApiHeaders()
let header = {}
//构建参数
let params = {
access_token: header['Access-Token'],
access_t_id: header['Access-T-Id'],
access_t_id_in: header['Access-T-Id-In'],
...option
}
//获取对应的长连接URL await system.getWebsocketUrl(linkMark, params)
//wss://dev.fushengkang.cn
//ws://192.168.1.103:8999
// let baseUrl = "wss://dev.fushengkang.cn"
let baseUrl = "ws://192.168.1.103:8999"
let url = baseUrl + `/wechat/ws/${data.id}/WebsocketByWechat.api`
//建立连接
this.socketTask = uni.connectSocket({
url,
header,
success() {
console.log('websocket:' + linkMark + '连接成功!')
}
})
//监听打开事件
this.socketTask.onOpen((res) => {
console.log('websocket:' + linkMark + '打开成功!')
this.isOpen = true
//开启心跳检测
this.heartBeatTest()
//回调
if (successFunc) {
successFunc(res)
}
})
//监听连接关闭事件
this.socketTask.onClose(() => {
console.log('websocket:' + linkMark + '已关闭!')
this.isOpen = false
if (closeFunc) {
closeFunc()
}
})
//监听websocket错误事件
this.socketTask.onError((res) => {
console.log('websocket:' + linkMark + '已出错!')
this.isOpen = false
if (errorFunc) {
errorFunc(res)
}
})
//监听接收到的消息
this.socketTask.onMessage((res) => {
if (receiveFunc) {
receiveFunc(res)
}
})
} catch (error) {
console.log('websocket:' + linkMark + '异常:' + error)
}
}
//发送消息(msg是一个对象)
sendMessage(msg = null, successFunc = null, errorFunc = null) {
if (!this.socketTask || !this.isOpen || !msg) {
if (errorFunc) {
errorFunc('未传消息内容或连接未打开!')
}
return
}
this.socketTask.send({
data: JSON.stringify(msg),
success(res) {
if (successFunc) {
successFunc(res)
}
},
fail(err) {
if (errorFunc) {
errorFunc(err)
}
}
})
}
//关闭连接
closeSocket() {
if (!this.socketTask || !this.isOpen) {
return
}
//关闭socket连接
this.socketTask.close()
//设置关闭状态
this.isOpen = false
}
//心跳检测
heartBeatTest() {
//清除定时器
clearInterval(this.globalTimer)
//开启定时器定时检测心跳
this.globalTimer = setInterval(() => {
this.sendMessage({
code: '10191',
msg: '维持心跳'
}, null, () => {
//如果失败则清除定时器
clearInterval(this.globalTimer)
})
}, 10000)
}
}
export default _WebSocket
使用方法
//导入websocket类
import _WebSocket from '@/util/gyy-websocket.js';
//实例化websocket对象
const websocket= new _WebSocket();
// 使用
init(){
try {
websocket.connectSocket({
//传参
},
'', //连接标识
{}, //可以传递额外的参数
null,
() => {
//出错的回调,重新建立连接
},
res => {
// 接收到得消息
},
() => {
// 关闭了就重新连接
if (this.yNremind) {
return
}
this.cloase(); // 关闭当前websoket
}
);
} catch (error) {
// console.log('live socket err:' + error);
}}
}
// 发送消息
sendMessage(){
websocket.sendMessage({}, (res) => {
// console.log(res, '时间校验')
}, err => {
// console.log(err, '时间校验')
})
}
// 关闭
cloase() {
websocket.closeSocket();
},