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>

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

相关推荐
予昊5 小时前
从零实现“在线五子棋对战“:WebSocket 实时通信 + 段位匹配
java·开发语言·网络·websocket
xx~t9 小时前
嵌入式——Linux软件编程——网络1
linux·c语言·网络·vscode·网络协议
MyFreeIT11 小时前
Let‘s Encrypt SSL 製作免費證書
网络协议·https·ssl
爱研究的小梁12 小时前
打破时延‑带宽悖论|乾元通 QMP‑UDP,为无人载具提供低延时高带宽原生通信方案
网络·网络协议·udp
xie0510_12 小时前
TCP socket
linux·网络协议·tcp/ip
恋恋西风13 小时前
TCP 三次握手 / 四次挥手 讲解
网络·网络协议·tcp/ip
00后程序员张13 小时前
Android证书绑定抓包失败?Android SSL Pinning绕过实战指南
android·网络协议·计算机网络·网络安全·adb·https·ssl
比兔代理13 小时前
动态 IP 代理深度讲解:IP 地址轮换机制与会话保持方案
网络·网络协议·tcp/ip
一直C14 小时前
Linux应用软件编程|TCP协议与Socket全套编程(三次握手、四次挥手、报文头部、核心机制)
linux·网络协议·tcp/ip·wireshark·vim·visual studio
隔窗听雨眠15 小时前
大模型实时通信协议深度对比:SSE、WebSocket与gRPC的选型指南与实战解析
网络·websocket·网络协议