2***@qq.com
2***@qq.com
  • 发布:2018-10-24 16:31
  • 更新:2020-09-18 09:54
  • 阅读:6931

uni-app手机休眠了,再次打开,如何执行uni.onSocketOpen,重新连接Websocket

分类:uni-app

uni-app手机休眠了,再次打开,如何执行uni.onSocketOpen,重新连接Websocket。

APP 运行到后端的时候,再次打开 写在onshow里的 uni.onSocketOpen 就不执行了,这个重新连接服务器要怎么才会触发的?

2018-10-24 16:31 负责人:无 分享
已邀请:
2***@qq.com

2***@qq.com (作者)

问题解决,鉴权的要放到 uni.connectSocket(OBJECT) 这里传就好了

  • 一切安好

    你好,我现在也想用这个鉴权,但是后台返回的信息完全没有,监听连接错误里面回调是一个空对象,后台返回的错误信息该怎么接收到呢?


    2021-03-04 15:17

a***@shuliangfu.com

a***@shuliangfu.com - Shu Liangfu

鉴权的是什么意思?我也碰到这个问题了,重新连接Socket onOpen函数没触发,你是怎么解决的?

1***@qq.com

1***@qq.com - uni-app使用者

简述原理:定义一个变量,让这个变量等于1,socket只要报错(onsocketerror),就让这个变量变量自增,(也就是变量++),当变量等于2的时候,用定时器重新建立连接,(为什么非要等于2的时候用定时器尝试连接呢,因为如果你不控制一下打开定时器尝试重连的次数,那么每次error都会新创建一个定时器,这样的话,页面上就好多个定时器在尝试重连,其实你只需要一个而已,当连接上之后,清除重连的那个定时器,并让之前设置的那个变量等于1,为的就是下次断了能再次重连)
直接上代码:

data:{
return{
socket_connect: false,
connect_num:1
}
}
init_socket() {
var heart_tiao;
var that = this;
this.orders_num_watch = 1;
uni.connectSocket({
url:ws_api+'/websocket/'+ that.shop_id,
success:(res)=>{
console.log('尝试连接');
uni.onSocketOpen(function(res) {
console.log('打开了');
that.connect_num = 1;
that.socket_connect = true;
heart_tiao = setInterval(function(){
uni.sendSocketMessage({
data: 'ping',
});
},6000);
uni.onSocketClose(function() {
console.log('socket已经关闭');
that.socket_connect = false;
});
});
},
fail:(res)=>{
console.log('主动连接失败');
}
});
uni.onSocketMessage(function(res) {
// console.log(res);
if (res.data != 'pong' && res.data != '连接成功') {
var message = JSON.parse(res.data)
if (message.num || message.num==0){
that.orders_num_watch = message.num;
that.socket_load();
}
}
});
uni.onSocketError(function(){
that.socket_connect = false;
clearInterval(heart_tiao);
if(that.connect_num==1){
that.reconnect_socket();
}
that.connect_num++;
console.log('错误了');

			})  
		},  
		reconnect_socket(){  
			var that = this;  
			connect_s = setInterval(function(){  
				if(!that.socket_connect){  
					console.log('重连一下');  
					that.init_socket();  
				}else{  
					clearInterval(connect_s);  
					console.log('已经连上了,退出定时器');  
				}  
			},3000);  
		},
  • 2***@qq.com

    that.socket_load();是什么方法


    2019-12-21 17:49

  • 1***@qq.com

    回复 2***@qq.com: 其实我写的那个还是有些问题的,息屏时间长了,进程还是会被杀死,定时器也是不行的,但是如果一直开着屏幕,是可以的,如果你想实现息屏之后的重连,估计费点儿劲


    2019-12-21 18:12

  • 2***@qq.com

    回复 1***@qq.com: 还是感谢大佬,我这边不存在熄屏的


    2019-12-23 17:41

3***@qq.com

3***@qq.com

请问息屏之后怎样才能重连啦?

该问题目前已经被锁定, 无法添加新回复