【WS】手机熄屏再唤醒后 websocket 的重连方法。

使用websocket长连接进行实时通信,在制作客服聊天或是必要的数据实时更新需求中是很好的选择,毕竟轮询大家都懂的

但是websocket服务端通常为了保证资源的有效利用,会加入心跳机制,当超过心跳时间未收到连接发过来的心跳,就主动断开连接释放资源,这种做法主要是为了应对断电,断网之类的极端情况,使得浏览器来不及发送断开请求。

问题也随之而来,js在手机熄屏后会中断,在唤醒之后js会继续执行。所以设置在js中的定时发送心跳包的功能在手机熄屏后就没法执行了。熄屏时间过长,这个时候链接就会被服务端强制断开,并且大部分手机在熄屏时,websocket连接就已经断开了。

问题的解决办法是,使用H5提供的页面隐藏/显示API。

document.addEventListener('visibilitychange',function() {
        if(document.visibilityState=='hidden') {
          that.hiddenTime = new Date().getTime()	//记录页面隐藏时间
        }else{
          let visibleTime = new Date().getTime();
          if((visibleTime-that.hiddenTime)/1000>10){	//页面再次可见的时间-隐藏时间>10S,重连
            typeof that.ws.close == 'function' && that.ws.close();    //先主动关闭连接
            console.log('主动关闭连接后重连');
            setTimeout(function(){
              that.openSocket()    //打开连接,使用的vuejs,这是websocket的连接方法
            },1500);    //1.5S后重连
          }else{
            console.log('还没有到断开的时间')
          }
        }
});

 

至于为什么断开要1.5s之后再重连,当然是因为断开需要时间啊。不然ws会报错,说连接早就关闭了。

 

总结:这个方法不仅适用熄屏后重连,也适用于手机浏览器被切换至后台运行时js中断的情况

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
UniApp中,当应用程序进入休眠状态后,WebSocket连接会被断开。当应用程序被唤醒时,你需要重新连接WebSocket以继续通信。以下是一种实现方式: 1. 在App.vue文件中,监听应用程序的生命周期事件。可以使用onShow和onHide方法来监听应用程序的前后台切换。 ```javascript export default { onShow() { // 应用程序从后台切换到前台时执行的代码 // 在这里重新连接WebSocket }, onHide() { // 应用程序从前台切换到后台时执行的代码 // 在这里关闭WebSocket连接 }, } ``` 2. 在需要使用WebSocket的页面或组件中,创建WebSocket实例并处理连接和断开事件。 ```javascript // 创建WebSocket实例 const socket = new WebSocket('ws://your-websocket-url'); // 监听WebSocket连接事件 socket.onopen = function() { console.log('WebSocket连接已打开'); }; // 监听WebSocket断开事件 socket.onclose = function() { console.log('WebSocket连接已断开'); }; // 监听WebSocket接收消事件 socket.onmessage = function(event) { console.log('收到消:', event.data); }; // 监听WebSocket错误事件 socket.onerror = function(error) { console.error('WebSocket发生错误:', error); }; ``` 3. 在应用程序从后台切换到前台时,调用重新连接WebSocket的逻辑。 ```javascript onShow() { // 应用程序从后台切换到前台时执行的代码 // 在这里重新连接WebSocket socket = new WebSocket('ws://your-websocket-url'); // 处理连接和断开事件,以及其他逻辑 } ``` 这样,当应用程序从休眠状态唤醒时,你就可以重新连接WebSocket并继续通信了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值