uniapp websocket机制 心跳 重连

本文详细介绍了在uniapp开发中如何使用WebSocket进行通信,包括建立连接、心跳机制以及在连接断开时的重连过程,提供相关代码示例和注意事项。

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

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

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

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

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

<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度就可以实现

<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>

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

 

### WebSocket后台连接断开原因及解决方案 在UniApp中,WebSocket连接可能会因为多种原因而断开。以下是可能导致断开的原因以及对应的解决方案: #### 1. **网络不稳定或断网** 当客户端的网络状态发生变化(例如从Wi-Fi切换到移动数据,或者完全断网)时,WebSocket连接可能会中断。这种情况下,客户端需要实现断线机制- **解决方案**:通过监听`onerror`和`onclose`事件,检测连接断开的情况,并尝试新建立连接[^1]。 ```javascript let ws = null; const reconnect = () => { if (ws) { ws.close(); } ws = uni.connectSocket({ url: 'ws://your-websocket-url', success() { console.log('WebSocket连接成功'); }, fail() { console.log('WebSocket连接失败,尝试连'); setTimeout(reconnect, 3000); // 每隔3秒试一次 } }); ws.onClose(() => { console.log('WebSocket连接关闭,尝试连'); setTimeout(reconnect, 3000); }); }; reconnect(); ``` #### 2. **服务器主动关闭连接** 如果服务器端配置了空闲超时时间(Idle Timeout),当客户端长时间没有发送或接收消息时,服务器可能会主动关闭连接。 - **解决方案**:通过心跳机制定期向服务器发送消息,保持连接活跃[^3]。 ```javascript let heartbeatInterval = null; const startHeartbeat = () => { heartbeatInterval = setInterval(() => { if (ws.readyState === ws.OPEN) { ws.send({ message: 'ping' }); } }, 30000); // 每30秒发送一次心跳包 }; const stopHeartbeat = () => { clearInterval(heartbeatInterval); }; ws.onOpen(() => { console.log('WebSocket连接已打开'); startHeartbeat(); }); ws.onClose(() => { console.log('WebSocket连接已关闭'); stopHeartbeat(); }); ``` #### 3. **客户端代码逻辑问题** 客户端可能由于未正确处理WebSocket的状态变化(如未及时关闭旧连接、复创建新连接等)导致连接异常。 - **解决方案**:确保每次创建新的WebSocket连接前,先关闭之前的连接实例。 ```javascript if (ws && ws.readyState !== ws.CLOSED) { ws.close(); } ``` #### 4. **跨平台兼容性问题** 在某些特定环境下(如H5、小程序、App),WebSocket的行为可能存在差异。例如,在`plus-websocket`中可能缺乏心跳机制支持[^2]。 - **解决方案**:针对不同平台进行适配,或者使用更可靠的第三方库替代原生WebSocket实现。 ```javascript if (uni.getSystemInfoSync().platform === 'android') { // 使用plus-websocket或其他替代方案 } else { // 使用原生WebSocket } ``` ### 注意事项 - 心跳机制的时间间隔应根据实际需求和服务器配置调整,避免过于频繁导致不必要的资源消耗。 - 断线连的频率也需合理设置,避免短时间内多次连对服务器造成压力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值