2021-06-22 uni-app的webscoket的使用【vuex】

uni-app的webscoket的使用

store —》index.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)
import Configuration from '@/config.js';
const store = new Vuex.Store({
			state: {
				socketTask: null,
				timeoutObj: null,
				reconnectCount: 0, //websocket连接次数,最大是3次
				isConnectedSocket: false,
				websocketUrl: 'ws://你的服务ip:9998/接口/', //websocket地址
			},
			mutations: {
				WEBSOCKET_INIT(state, url) {
					state.socketTask = uni.connectSocket({
						url, // url是websocket连接ip
						success() {
							state.isConnectedSocket = true;
							console.log('websocket连接成功')
						}
					})
					state.socketTask.onOpen((res) => {
						console.log('WebSocket连接正常打开中...!');
						// 开启检测
						state.timeoutObj = setTimeout(() => {
							//这里发送一个心跳,后端收到后,返回一个心跳消息,
							//onmessage拿到返回的心跳就说明连接正常
							console.log('ping');
							state.socketTask.send({
								data: "ping1----"
							});
						}, 5000)
						// 注:只有连接正常打开中 ,才能正常收到消息
						state.socketTask.onMessage(res => {
							clearTimeout(state.timeoutObj);
							console.log(res)
							console.log('收到服务器内容')
						});
					})
					state.socketTask.onError((res) => {
						console.log('WebSocket连接打开失败,请检查!');
					});
				},
				WEBSOCKET_SEND(state, data) {
					console.log("ws发送")
					state.socketTask.send({
						data: data,
						async success() {
							console.log('消息发送成功')
						},
						fail: (res) => {
							console.log(res)
						}
					})
				},
				CLOSE_SOCKET(state) {
					if (!state.socketTask) return
					state.socketTask.close({
						success(res) {
							console.log('关闭成功', res)
						},
						fail(err) {
							console.log('关闭失败', err)
						}
					})
					}
				},
				actions: {
					WEBSOCKET_INIT({
						commit
					}, url) {
						commit('WEBSOCKET_INIT', url)
					},
					WEBSOCKET_SEND({
						commit
					}, data) {
						commit('WEBSOCKET_SEND', data)
					},
					CLOSE_SOCKET({
						commit
					}) {
						commit('CLOSE_SOCKET')
					}
				}
			})

	export default store

使用:

this.$store.dispatch('WEBSOCKET_INIT', this.websocketUrl +入参)

优化分析:
index.js

import Vue from 'vue'
import Vuex from 'vuex'
import state from './state.js'
import mutation from './mutations.js'
import action from './action.js'

Vue.use(Vuex)

const store = new Vuex.Store({
	state: state,
	mutations:mutation,
	actions: action
})

export default store

state.js

const state ={
	socketTask: null,
	timeoutObj: null,
	reconnectCount: 0, //websocket连接次数,最大是3次
	isConnectedSocket: false,
	websocketUrl: 'ws://你的服务ip:9998/接口/', //websocket地址
}

action.js

const action = {
	WEBSOCKET_INIT({//连接
	commit
	}, url) {
		commit('WEBSOCKET_INIT', url)
	},
	WEBSOCKET_SEND({//向服务器发送数据
		commit
	}, data) {
		commit('WEBSOCKET_SEND', data)
	},
	CLOSE_SOCKET({//关闭连接
		commit
	}) {
		commit('CLOSE_SOCKET')
	}
}

mutations.js

const mutations ={
   WEBSOCKET_INIT(state, url) {
	state.socketTask = uni.connectSocket({
		url, // url是websocket连接ip
		success() {
			state.isConnectedSocket = true;
			console.log('websocket连接成功')
		}
	})
	state.socketTask.onOpen((res) => {
		console.log('WebSocket连接正常打开中...!');
		// 开启检测
		state.timeoutObj = setTimeout(() => {
			//这里发送一个心跳,后端收到后,返回一个心跳消息,
			//onmessage拿到返回的心跳就说明连接正常
			console.log('ping');
			state.socketTask.send({
				data: "ping1----"
			});
		}, 5000)
		// 注:只有连接正常打开中 ,才能正常收到消息
		state.socketTask.onMessage(res => {
			clearTimeout(state.timeoutObj);
			console.log(res)
			console.log('收到服务器内容')
		});
	})
	state.socketTask.onError((res) => {
		console.log('WebSocket连接打开失败,请检查!');
	});
},
WEBSOCKET_SEND(state, data) {
	console.log("ws发送")
	state.socketTask.send({
		data: data,
		async success() {
			console.log('消息发送成功')
		},
		fail: (res) => {
			console.log(res)
		}
	})
},
CLOSE_SOCKET(state) {
	if (!state.socketTask) return
	state.socketTask.close({
		success(res) {
			console.log('关闭成功', res)
		},
		fail(err) {
			console.log('关闭失败', err)
		}
	})
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值