Vue中使用webSocket
转载
/* utils/serve_socket.js */
export default class SocketService {
/**
* 单例
*/
static instance = null
static get Instance () {
if (!this.instance) {
this.instance = new SocketService()
}
return this.instance
}
ws = null // 和服务端连接的socket对象
callBackMapping = {}// 存储回调函数
connected = false // 标识是否连接成功
sendRetryCount = 0 // 记录重试的次数
connectRetryCount = 0 // 重新连接尝试的次数
// 定义连接服务器的方法
connect () {
// 连接服务器
if (!window.WebSocket) {
return console.log('您的浏览器不支持WebSocket')
}
this.ws = new WebSocket('ws://192.168.0.254:9000')
// 连接成功的事件
this.ws.onopen = () => {
console.log('连接服务端成功了')
this.connected = true
// 重置重新连接的次数
this.connectRetryCount = 0
}
// 1.连接服务端失败
// 2.当连接成功之后, 服务器关闭的情况
this.ws.onclose = () => {
console.log('连接服务端失败')
this.connected = false // 连接表示(失败)
this.connectRetryCount++ // 重连次数
// 如果连接失败,每个一段事件重连一次
setTimeout(() => {
this.connect()
}, 500 * this.connectRetryCount)
}
// 得到服务端发送过来的数据
this.ws.onmessage = msg => {
console.log(msg);
// 服务器响应的数据格式 {message: 'ue_get',data: {}, type: 'MME'}
const recvData = JSON.parse(msg.data)
const socketType = recvData.message // 消息类型
// 判断回调函数是否存在
if (this.callBackMapping[socketType]) {
const action = recvData.message
switch (action) {
case 'ue_get':
// 调用注册的回调函数函数
this.callBackMapping[socketType].call(this, recvData.ue_list)
break;
case 'log_get':
this.callBackMapping[socketType].call(this, recvData.log_get)
break;
default:
this.callBackMapping[socketType].call(this, [])
break
}
}
}
}
// 回调函数的注册
registerCallBack (socketType, callBack) {
this.callBackMapping[socketType] = callBack
}
// 取消某一个回调函数
unRegisterCallBack (socketType) {
this.callBackMapping[socketType] = null
}
// 发送数据的方法
send (data) {
// 判断此时此刻有没有连接成功
if (this.connected) {
this.sendRetryCount = 0
this.ws.send(JSON.stringify(data))
} else {
this.sendRetryCount++
setTimeout(() => {
this.send(data)
}, this.sendRetryCount * 500)
}
}
}
export default {
created() {
this.$socket.registerCallBack('ue_get', this.getdata)
},
mounted() {
this.$socket.send({ message: 'ue_get' })
},
destroyed() {
this.$socket.unRegisterCallBack('ue_get')
},
methods: {
getdata(res) {
console.log('服务端响应的数据', res)
}
}
}
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。