uniapp的webscoket 连接


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();
		},