uniapp websocket 封装断线重连

这篇具有很好参考价值的文章主要介绍了uniapp websocket 封装断线重连。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 1.新建一个工具类js文件

uniapp websocket 重连,uni-app,websocket,html5

2. 把我封装的代码复制进去

//引入vuex,因为我需要使用vuex存储得到的数据
import store from "@/store/index.js"
// 连接
let socketTask = null
// 是否主动关闭连接
let meClose = false
// 地址 写你的后端连接地址
let url = "ws://192.168.1.2:8888/ws/"
let token = null
// 重连定时器
let Time = null
// 心跳定时器
let XTime = null
// 开启连接
const sokcet = () => {
    // 我这个项目需要在连接的时候带token,不需要可以只写url地址
	token = uni.getStorageSync("token") //token
	// console.log(url + token);
	//判断是否有websocet对象,有的话清空
	if (socketTask) {
		uni.closeSocket()
		socketTask = null;
	}
	// 进行连接
	socketTask = uni.connectSocket({
		url: url + token, //仅为示例,并非真实接口地址。不需要带token可以只写url地址
		success(data) {
			clearInterval(Time) //关闭定时器
			clearInterval(XTime) //关闭心跳定时器
			console.log("创建连接!");
			// 监听是否连接
			uni.onSocketOpen((res) => {
				console.log('连接成功!获取离线信息');
				sendMsg("1000")
				clearInterval(Time) //关闭定时器
				clearInterval(XTime) //关闭心跳定时器
				// 5秒发送一次心跳//后端检测是否在线
				XTime = setInterval(() => {
					// console.log("心跳");
					sendMsg("2000")
				}, 5000)
			});
		}
	});

	// 监听连接失败
	uni.onSocketError((err) => {
		console.log('连接失败,请检查');
		if (!meClose) {//判断是否主动关闭进行重新连接
			reconnect()
		}
	})
	// 监听连接关闭close
	uni.onSocketClose((e) => {
		console.log('连接关闭!', meClose);
		if (!meClose) {//判断是否主动关闭进行重新连接
			reconnect()
		}
	})
	// 监听收到信息
	uni.onSocketMessage((res) => {
		let data = JSON.parse(res.data)
		// 接收数据后回调
		console.log('服务器内容:', data);
        // 我存储数据到vuex
		// 全部消息列表
		// store.commit("login/pushList", data)
		// 提醒消息列表 
		// store.commit("login/unshiftMessage", data)
		// 存储到本地
		// store.commit("login/setvuex")
		// uni.onPushMessage((res) => {
		// 	// 后台提醒内容 需要后端配置,也可以不要
		//if (uni.getStorageSync("uuid") != data.senderId) {
			//let name = data.names ? data.names : "新消息"
			//let text = data.payload.text ? data.payload.text : "你有一条新消息待查看"
			// console.log(name);
			// console.log(text);
			//uni.createPushMessage({
			//	title: name,
			//	content: text,
			//	sound: "system",
			//	icon: "/static/images/logobc.png",
			//	 payload:{
			//	这里地方你可以随意组合你想要的数据,uni.onPushMessage会监听到你组合的数据。
			//	 },
		//		success: (res => {
		//			 console.log('成功创建')
		//		}),
		//	})
		//}
		// console.log("收到推送消息:", JSON.parse(res.data)) //监听推送消息
		// })

	});
}
// 重新连接
const reconnect = () => {
	console.log("开始断线重连!!!!!!!!!!!");
	// 确保已经关闭后再重新打开
	uni.closeSocket()
	socketTask = '';
	console.log("重新连接中...");
	// console.log(url + token);
	sokcet(url + token)
}
//向后端发送信息
const sendMsg = (msg) => {
	msg = JSON.stringify(msg)
	// console.log(msg);
	//通过 WebSocket 连接发送数据
	uni.sendSocketMessage({
		data: msg,
		success() {
			// console.log("成功");
		},
		fail() {
			console.log("失败");
			uni.showLoading({
				title: "加载中..."
			})
			setTimeout(() => {
				uni.hideLoading()
			}, 1000)
			if (!meClose) {
				reconnect()
			}
		},
	});
}
// 手动关闭连接
const stop = () => {
	// 主动关闭连接
	meClose = true
	uni.closeSocket({
		success() {
			console.log("手动关闭成功!");
			clearInterval(Time) //关闭定时器
			clearInterval(XTime) //关闭心跳定时器
			// 确保已经关闭
			socketTask = null;
		}
	})
}
// 导出方法
export const websocetObj = {
	sokcet, //连接
	stop, //关闭
	sendMsg //发送
};

我是用uniapp 的api封装的 在外面也可以直接用uniapp的api操作

只有在开始调用连接需要用封装的方法调用

在需要使用封装的方法的页面 引入js

    import {
        websocetObj
    } from "@/API/websocket.js"

 完善重连

在app.vue的onShow生命周期发送心跳检测是否连接(写在这个生命周期可以提高连接速度)

// 发送一次心跳,没有成功就触发重新连接
  websocetObj.sendMsg("2000")

调用连接方法

//请求连接
 websocetObj.sokcet()

关闭连接

 // 关闭连接
  websocetObj.stop()

 发送消息

sendTextMessage() { //发送消息
                if (this.content.trim() != '') {
                    let date = new Date()
                    let jsondata = {
                        groups: 0,
                        payload: {
                            text: this.content,
                            tpUrl: "",
                            spUrl: ""
                        },
                        receiverId: this.frienduuid,
                        senderId: this.user.uuid,
                        names: this.user.names,
                        avatar: this.user.avatar,
                        status: "success",
                        timestamp: date.getTime(),
                        type: "text"
                    };

                     // 使用封装方法发送
                    // websocetObj.sendMsg(jsondata)

                    // 使用uniapp 原生方法发送(我使用原生方法是因为想加一个消息发送失败提醒)
                    let msg = JSON.stringify(jsondata);
                    uni.sendSocketMessage({
                        data: msg,
                        success: () => {
                            //发送成功的方法
                            console.log("给" + this.title + "消息发送成功");
                        },
                        fail() {
                            uni.showToast({
                                title: '消息发送失败,请检查网络',
                                icon: 'none'
                            });
                        }
                    });
                    // 调用滚动到最下面的方法
                    this.scrollToBottom();
                    // 清空输入框
                    this.content = "";
                }
            },

 这个就是断线重连的过程 自动检测到服务器断线然后自动重新连接,中间报错是正常的没有连接到的报错,直到连接成功获取离线消息表示连接好了

uniapp websocket 重连,uni-app,websocket,html5

 封装思想:

通过uniapp提供的API方法进行封装

断线重连机制:

通过发送心跳检测是否能够发送成功判断是否连接

 有不理解的地方欢迎私信或者评论问!!文章来源地址https://www.toymoban.com/news/detail-670987.html

到了这里,关于uniapp websocket 封装断线重连的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • websocket断线重连&&心跳检测

    封装websocket 实现断线重连跟心态检测,使用的typeScript去封装 在nodejs 安装ws库 代码如下(示例):  服务端实现ws 创建一个server.js 文件 运行ws服务   node .server.js  客户端实现websocket 创建一个socket.ts 文件 vue 页面使用 断开ws服务 断线  启动服务后 自动重连

    2024年01月19日
    浏览(40)
  • WebSocket的心跳机制和断线重连

    在服务器重启或是弱网情况下,前端不能保证一直连接成功。因此在出现被动断开的情况下,需要有 心跳机制 和 断线重连 的功能。 心跳机制 :客户端每隔一段时间向服务端发送一个特有的心跳消息,每次服务端收到消息后只需将消息返回,此时,若二者还保持连接,则客

    2024年01月18日
    浏览(45)
  • websocket的基础使用,心跳机制,断线重连

    websoket出现的原因: 传统的http请求只能是由前端向后台发送一个请求,然后后台把结果返回给前端,前端再进行展示。这里就暴露了一个问题,就是通信只能由前端发起,而后台无法主动与前端通信。而websoket的出现就是为了解决这个问题,让前端可以主动联系后台,后台也

    2024年02月06日
    浏览(49)
  • Java连接websocket优雅断线、重连功能

          为了实现优雅重连和重试,您需要在代码中添加一些逻辑来处理连接失败或断开连接的情况。 实现代码如下:

    2024年02月10日
    浏览(38)
  • java实现WebSocket客户端&&断线重连机制

    1、引入maven依赖(注意版本) 2、代码

    2024年02月16日
    浏览(49)
  • Android中okhttp的websocket的详细使用方法(加断线重连)

    介绍之类的就不多讲了,懒得讲也未必有别人整理的清晰,直接上代码 使用:

    2024年02月15日
    浏览(35)
  • uni-app使用websocket

    原文链接:https://blog.csdn.net/weixin_43343144/article/details/92998467

    2024年02月07日
    浏览(43)
  • websocket和uni-app里使用websocket

    特点: 1、浏览器发送请求时,浏览器和服务器会建立一个连接。完成请求和响应。在http1.0之前,每次请求响应完毕后,会立即断开连接。在http1.1之后,当前网页的所有请求响应完毕后,才断开连接。 2、这样就意味着,服务器并不清楚,某次连接和以前的哪个连接来自于同

    2024年02月11日
    浏览(37)
  • uni-app组件封装基本知识

            小写字母,单词用“ - ”链接例如(bj-item ) , 目录名称和文件名保持一致,官方默认把“ uni- ”开头的 组件全局挂载,不是这种格式的组件需要局部挂载。 1 、“ uni- ”开头的组件官方默认全局挂载  2、组件使用 随着Hbuilder的升级,现在组件统一放到uni_module

    2023年04月08日
    浏览(47)
  • uni-app封装的request请求

    config.js    main.js 页面使用:

    2024年02月12日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包