uniapp websocket机制 心跳 重连

在开发程序过程中通信功能还是比较常用到的,本文主要介绍的是uniapp中websocket的使用

websocket建立连接后,断开、心跳机制重新链接的一个过程。

关于uni.connectSocket可仔细阅读uniapp官网中的uni.connetSocket以及连接socket创建的实例****SocketTask****

具体代码如下:内有代码详细注解,如果疑问可在评论区留言。

javascript 复制代码
<script>
    
    var socketTaskChat//全局定义websocket创建的实例名称
    var interVal //全局定义定时执行心跳监测定时器ID,用于清除定时器
	var reconnectTimer //全局定义定时执行一次重连定时器ID,用于清除定时器

    export default{
        data(){

        },
        onLoad(){
            //设置屏幕保持常亮不灭
            uni.setKeepScreenOn({
				keepScreenOn: true
			});
            //创建socket链接
            this.webSocketConfig()
        },
        methods:{
           //建立socekt链接
            webSocketConfig()
            {
              //清除心跳、重连定时器,停止心跳检测
              clearTimeout(reconnectTimer)
              clearInterval(interVal)
              var that = this
              var socketOpen = false;
              uni.closeSocket() //socketTaskChat
                //创建连接
              socketTaskChat = uni.connectSocket(
                {
                  url: "wss://ws.xxxx.net/",
                  data()
                  {
                    return {};
                  },
                  header:
                  {
                    'content-type': 'application/json',
                  },
                  method: 'GET',
                  success: res =>
                  {
                    console.log("socket链接成功")
                  },
                  fail: () =>
                  {
                    that.$refs.uToast.showToast(1, "WebSocket连接打开失败")
                  },
                  complete: () =>
                  {
                    console.error("complete")
                  }
                });
              socketTaskChat.onError(function(res)
                                     {
                uni.showToast(
                  {
                    title: '连接超时,请耐心等候',
                    duration: 4000,
                    icon: 'none',
                    mask: true
                  })
                //心跳监测
                that.handleHeart()
              });
              socketTaskChat.onClose(function(res)
                                     {
                console.error("onClose")
                that.isConnect = false
              });
              socketTaskChat.onOpen(function(res)
                                    {
                // clearInterval(interVal)
                console.error("onOpen")
                socketOpen = true;
                that.isConnect = true
                 //停止心跳检测
                clearTimeout(reconnectTimer)
                clearInterval(interVal)
               
              });
              socketTaskChat.onMessage(function(res)
                                       {
                // console.error("res", res)
                const data = JSON.parse(res.data);
                if(data.tips == '未开播')
                {
                  that.$refs.uToast.showToast(1, "抖音未开播")
                  that.contentShow = "当前直播间未开播,确定关闭吗?"
                  that.showModal = true
                }
                else if(data.status == 1)
                {
                    that.isLive = 1
                    //接收到的消息处理区域
                    //xxxxxxx
                    //xxxxxxx
                }
              });
            },
            //心跳检测
			handleHeart() {
				var that = this
				console.error("心跳监测")
				if (that.isLive == 1) { //满足:已经开启过链接且中途断开方可重连
                    //设置定时开始心跳检测
					interVal = setInterval(function() {
                        //发送消息,验证是否存在心跳
						that.handleSend()
					}, 5 * 1000)
				}
				/* else {
					console.error("心跳监测222", interVal)
					if (interVal) {
						clearInterval(interVal)
					}
				} */
			},
            //发送消息
            handleSend() {
				var that = this
				var data = {
					state: 1,
					method: 'heartbeat'
				}
				socketTaskChat.send({
					data: data,
					success(res) {},
					fail(res) {
						console.log('发送失败', that.isLive)
						//重连socekt
						that.reconnect()
					}
				});
			},
            // 重新连接socket
			reconnect() {
				var that = this
				// 停止发送心跳
				clearTimeout(reconnectTimer)
				clearInterval(interVal)
				if (that.isLive == 1) { //满足:已经开启过链接且中途断开方可重连
                    //定时执行一次websocket链接方法,进行socket重连
					reconnectTimer = setTimeout(() => {
                        //开启socket链接
						that.webSocketConfig()
					}, 5 * 1000)
				}
			},
        }
    }

</script>

我这边实现的是类似抖音直播评论区的展示效果,每接收一条数据从列表最底部加入更新

transform 属性允许你旋转,缩放,倾斜或平移给定元素。这是通过修改 CSS 视觉格式化模型的坐标空间来实现的

旋转 rotate(deg)

可以对元素进行旋转,正值为顺时针,负值为逆时针

外层scroll-view设置180度,内层view设置180度就可以实现

html 复制代码
<scroll-view scroll-y class="scroll-list">
                <view class="show-view" v-for="(item,index) in barrageList" :key="index">

                        {{item.content}}

                </view>
 </scroll-view>

<style lang="scss" scoped>

.scroll-list {
		position: fixed;
		top: 700rpx;
		bottom: 0;
		transform: rotate(180deg);//主要是这一行跟.show-view中的样式决定从底部更新展示
	}

	.show-view {
		display: flex;
		align-items: center;
		justify-content: flex-start;
		flex-direction: row;
		padding: 0 5%;
		transform: rotate(180deg);//主要是这一行跟.scroll-list中的样式决定从底部更新展示

	}
</style>

以上完成,如果疑问评论区留言即可。

相关推荐
她是太阳,好耀眼i9 小时前
配置FTP目录文件以http网址方式访问并下载
网络·网络协议·http
sc.溯琛10 小时前
数据链路层复习总结
网络·网络协议·智能路由器
qq192263810 小时前
探索STM32G431实现无感FOC驱动:从高频注入到滑膜观测器
网络协议
非凡ghost11 小时前
Audacity(免费开源跨平台音频软件)中文绿色版
网络·网络协议·音视频·软件需求
乾元11 小时前
Syslog / Flow / Telemetry 的 AI 聚合与异常检测实战(可观测性)
运维·网络·人工智能·网络协议·华为·自动化·ansible
homelook11 小时前
uniapp蓝牙demo
uni-app
YANshangqian12 小时前
网页Http远程启动应用工具
网络·网络协议·http
itas10912 小时前
windows单网卡配置多网段IP
windows·网络协议·tcp/ip·多网段ip
拾忆,想起12 小时前
Dubbo深度解析:从零到一,高性能RPC框架如何重塑微服务架构
网络协议·微服务·云原生·性能优化·rpc·架构·dubbo
老蒋新思维12 小时前
创客匠人峰会洞察:AI 时代教育知识变现的重构 —— 从 “刷题记忆” 到 “成长赋能” 的革命
大数据·人工智能·网络协议·tcp/ip·重构·创始人ip·创客匠人