【uniApp】 webSocket 封装和uni.request封装及使用方式

该篇博客详细介绍了如何使用WebSocket实现与服务器的连接、心跳机制、重连策略以及消息处理。同时,展示了如何封装uni-app的网络请求模块,包括GET和POST请求的实现。内容涵盖连接状态管理、错误处理以及数据解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

websocket
import meApi from '@/common/meApi.js'
//是否已经连接上ws
let isOpenSocket = false
//心跳间隔,单位毫秒
let heartBeatDelay = 3000
let heartBeatInterval = null
//心跳时发送的消息文本
let heartBeatText = ""
//最大重连次数
let reconnectTimes = 10
let reconnectInterval = null
//重连间隔,单位毫秒
let reconnectDelay = 3000

// let wsUrl = "ws://XXXX.SERVER"
let wsUrl = meApi.ws_device

let socketTask = null

//这个参数是防止重连失败之后onClose方法会重复执行reconnect方法,导致重连定时器出问题
//连接并打开之后可重连,且只执行重连方法一次
let canReconnect = false

//封装的对象,最后以模块化向外暴露,
//init方法 初始化socketTask对象
//completeClose方法 完全将socketTask关闭(不重连)
//其他关于socketTask的方法与uniapp的socketTask api一致
let ws = {
	socketTask: null,
	init,
	completeClose
}

function init(agentData, messageCallback) { // 两个参数:发送不同的标识&处理接收消息
	var socketTask = uni.connectSocket({
		url: wsUrl,
		complete: () => {}
	})

	socketTask.onOpen((res) => {
		console.log("ws连接成功")
		clearInterval(heartBeatInterval)
		clearInterval(reconnectInterval)
		isOpenSocket = true
		canReconnect = true
		//send(JSON.stringify(agentData));
		send(agentData)
		//开启心跳机制
		// heartBeat()
	})


	socketTask.onMessage((res) => {
		//自定义处理onMessage方法
		// console.log(res)
		onWsMessage(res, messageCallback) //


	})
	socketTask.onClose(() => {
		if (isOpenSocket) {
			console.log("ws与服务器断开")
		} else {
			console.log("连接失败")
		}
		isOpenSocket = false
		if (canReconnect) {
			reconnect()
			canReconnect = false
		}
	})
	ws.socketTask = socketTask
}

function heartBeat() {
	heartBeatInterval = setInterval(() => {
		console.log(heartBeatText)
		send(JSON.stringify(heartBeatText));
	}, heartBeatDelay)
}

function onWsMessage(event, messageCallback) { // 处理接收消息
	const jsonStr = event.data
	//writeToScreen('onWsMessage接收到服务器的数据: ', jsonStr)
	var msg = JSON.parse(jsonStr);
	messageCallback(msg)
}

function send(value) {
	ws.socketTask.send({
		data: value,
		async success() {
			console.log("消息标识发送成功", value)
		}
	});
}

function reconnect() {
	//停止发送心跳
	clearInterval(heartBeatInterval)
	//如果不是人为关闭的话,进行重连
	if (!isOpenSocket) {
		let count = 0;
		reconnectInterval = setInterval(() => {
			console.log("正在尝试重连")
			init();
			count++
			//重连一定次数后就不再重连
			if (count >= reconnectTimes) {
				clearInterval(reconnectInterval)
				console.log("网络异常或服务器错误")
			}
		}, reconnectDelay)
	}
}

function completeClose() {
	//先将心跳与重连的定时器清除
	clearInterval(heartBeatInterval)
	clearInterval(reconnectInterval)
	canReconnect = false
	ws.socketTask.close()
}

module.exports = ws

/**
 * USE
 * 
	 onLoad(){
		 let token = uni.getStorageSync('access_token');
		 this.$ws.init(token, (data) => {
			this.handlerWebSocketMsg(data)
		 })
	 }
 
 	methods: {
		//处理websocket返回的消息
		handlerWebSocketMsg(msg) {
			if (msg.msg_type === 'A') {
				if (msg.imei === this.Info.imei) {
					this.message = msg
				}
			}
			if (msg.msg_type === 'B') {}
			if (msg.msg_type === 'C') {
				uni.navigateTo({
					url: '../login/login'
				})
			} else {
		
			}
		},
	}
 */

uni.request
// request.js
// 通常可以吧 baseUrl 单独放在一个 js 文件了
// const baseUrl = 'http://xxx.xxx.4.xxxx:8093/chemApp'
const baseUrl = ''
//const token = uni.getStorageSync('access_token')

const request = (options = {}) => {

	options.header = {
		'Authorization': uni.getStorageSync('access_token'),
		"Content-Type": "application/x-www-form-urlencoded"
	}
	return new Promise((resolve, reject) => {
		uni.request({
			url: baseUrl + options.url || '',
			method: options.type || 'GET',
			data: options.data || {},
			header: options.header || {}
		}).then(data => {
			let [err, res] = data;
			resolve(res);
		}).catch(error => {
			reject(error)
		})
	});
}

const get = (url, data, options = {}) => {

	options.type = 'GET';
	options.data = data;
	options.url = url;
	return request(options)
}

const post = (url, data, options = {}) => {
	options.type = 'POST';
	options.data = data;
	options.url = url;
	return request(options)
}


export default {
	request,
	get,
	post
}



/*
* USE
*
import meRequest from '@/common/meRequest.js'
	
initViewData(deviceId) {
	uni.showLoading({
		title: this.$t('common').loading
	})
	meRequest.post(meApi.post_detail, {
		deviceId
	}).then(res => {
		uni.hideLoading()
		if (res.data.code === 1000) {
		}
	})
},
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值