uni.socket流式打字效果

文章讲述了如何在uni-app中创建WebSocket连接,包括连接建立、消息监听、心跳机制以及重连策略。还提到在组件生命周期中初始化和管理WebSocket连接的方法。
摘要由CSDN通过智能技术生成

创建websocket链接,发送链接请求

uni.onSocketOpen函数监听是否链接成功这里调用了发送心跳机制,一会儿有讲到。

uni.onSocketMessage为监听收到的信息,res为接受到返回的参数

uni.onSocketClose为监听链接关闭

createSocket: function() {
				// 创建 WebSocket 连接
				try {
					let that = this
					uni.connectSocket({
						url: `${host}/open/chat/ask`,
						header: {
							'content-type': 'application/json',
							'Access-Control-Allow-Credentials': true,
							'Access-Control-Allow-Origin': '*'
						},
						success: data => {
							console.log('socket 连接成功', data.errMsg);
							that.socketClose = 1;
						},
						fail: data => {
							console.error('socket 连接失败', data);
						},
					});
					uni.onSocketOpen(function(err) {
						that.socketClose = 2;
						//发送心跳
						that.startHeartbeat();
						console.log('链接成功', that.socketClose)
					});
					// 监听收到信息
					uni.onSocketMessage(function(res) {
						console.log(res.data,'onSocketMessage')
						// if(!that.desitory) return
						//与后端规定好返回值分别代表什么,写业务逻辑
						let serverData = JSON.parse(res.data) //这是字符串,如果要对象记得转换一下
						if (serverData.response.split("\n").length > 1) {
							// that.sleep(5)
							console.log(serverData.response, 'serverData.response')
							that.chatList.push({
								isself: false,
								msg: serverData.response
							})

						} else {
							if (serverData.doc != null) {
								that.isLoading = false
								return
							}
							that.chatList[that.chatList.length - 1].msg += serverData.response
						}

						// console.log(that.chatList, 'that.chatList')
						that.setScroll()
						that.session = serverData.session
					});
					uni.onSocketClose(function(res) {
						that.socketClose = 3;
						that.desitory = true
					})
				} catch (error) {
					console.log('err:' + error)
				}
			},

向websocket发送请求

这里就是向服务器发送消息,uni.sendSocketMessage这个方法里面发了消息,那么在上图的

uni.onSocketMessage()这个方法里面就可以获取到服务器返回的数据了

		sendMessage: function() {
				let datas = JSON.stringify({
					"prompt": `${this.inputText}`,
					"session": this.session,
					"name": uni.getStorageSync('user_name')
				})
				uni.sendSocketMessage({
					data: datas
				})
				this.inputText = "";
				this.isLoading = true
				this.chatList.push({
					isself: false,
					msg: ''
				})
			},

websocket重连机制

通过定时器去调用,通过定时器循环调用进行重连,目的是为了网络波动使得websocket断开链接,这里重新调用that.createSocket()函数,并且通过判断语句来监听是否链接成功,如果链接成功则清除定时器

	//定时调用
			interval() {
				let that = this
				  //coket断开开始重新链接
				that.isCron = setInterval(function() {
					if (that.socketClose !== 2 && that.desitory) {
						console.log('setInterval', that.socketClose, that.desitory)
						if (that.socketClose === 1) {
							uni.closeSocket();
						}
						that.createSocket()
						 clearTimeout(this.socketTimer);
						that.show = true
					} else {
						that.show = false
					}
				}, 3000);
			},

websocket心跳机制

心跳机制目的是websocket是一个长链接,如果长时间或者几分钟不进行链接,那么websocket会自动进行断开,虽然上面的重连机制会重新链接,但是重连的时候会弹窗,这样对用户的体验性就不好,所以我们利用定时器每个20秒向服务器发送一条消息,这里和后端商量好发送这条固定的消息服务器不返回东西就可以了。

  // 发送心跳包
			        startHeartbeat () {
			            // HeartBeat 这里是和后端约定好的值,我们发送给后端,后端再把这个值返给我们
			            // 目的就是让后端知道我们一直在    
			            const sendHeartbeat = () => {
			                if (this.socketClose===2) {
								const heartbeatMsg = JSON.stringify({
									cmd:'HeartBeat'
								})
			                    uni.sendSocketMessage({
			                        data: heartbeatMsg,
			                    }).catch(error => {
			                        console.log('发送心跳消息失败:', error);
			                    });
			                }
			            };
			            this.socketTimer = setInterval(sendHeartbeat, 20000);
			        },

接下来是时间节点也就是生命周期

我们在创建组件时的生命周期销毁组件这两个生命周期里面调用this.createSocket()建立socket链接,this.interval()和重连机制

在uni.onSocketMessage()监听到链接成功的时候发送心跳机制

友情提示记得用that哟,因为在uni的这些api里面使用this去调用自身定义的属性或方法this指向会不正确的

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值