前端网络监控与断网重链

业务背景

最近在做大屏数据可视化项目得时候,在思考项目交付和运行情况得时候,考虑到了需要在公司大屏显示器上面展示,突然想到了项目可能面临断网及其网速慢得情况下得一下展示问题,因此作为专栏进行这两个问题得讲解

问题一 WebSocket 在网络终端和重新联网后自动链接

知识点: 理解WebSocket心跳及重连机制

在使用websocket的过程中,有时候会遇到网络断开的情况,但是在网络断开的时候服务器端并没有触发onclose的事件。这样会有:服务器会继续向客户端发送多余的链接,并且这些数据还会丢失。所以就需要一种机制来检测客户端和服务端是否处于正常的链接状态。因此就有了websocket的心跳了。还有心跳,说明还活着,没有心跳说明已经挂掉了。

  • 为什么叫心跳包呢?
    它就像心跳一样每隔固定的时间发一次,来告诉服务器,我还活着。
  • 心跳机制是?

心跳机制是每隔一段时间会向服务器发送一个数据包,告诉服务器自己还活着,同时客户端会确认服务器端是否还活着,如果还活着的话,就会回传一个数据包给客户端来确定服务器端也还活着,否则的话,有可能是网络断开连接了。需要重连~

那么需要怎么去实现它呢?如下所有代码:

let ws = null,
    wsUrl = "ws://xxx/rest/api/websocket",
    lockReconnect = false,
    tt = null,
    that = this;
    function MonitorWebSocket(wsUrl){
        this.timeout = 3000;
        this.timeoutObj = null;
        this.serverTimeoutObj= null;

        try {
            ws = new WebSocket(wsUrl);
            this.init(wsUrl);
        } catch(e) {
            console.log('catch');
            this.reconnect(wsUrl);
        }
    }
    MonitorWebSocket.prototype.init = function (wsUrl) {
        ws.onopen = () => {
             //心跳检测重置
            that.navigatorStatus()
            // console.log("client:打开连接-心跳检测开启");
            this.heartCheckStart();
        };
        ws.onmessage = e => {
            // 拿到任何消息都说明当前连接是正常的
            // console.info('onmessage---->接收到消息');
            this.heartCheckStart();
            that.list = JSON.parse(e.data).data;
            that.list.todayData && that.$emit("changePointStatus",that.list.todayData)
        };
        ws.onclose = params => {
            // console.log('链接关闭');
            this.reconnect(wsUrl);
        };
        ws.onerror = function(e) {
            // console.log('发生异常了');
            this.reconnect(wsUrl);
        };
    }
    MonitorWebSocket.prototype.reconnect = function(wsUrl) {
        if(lockReconnect) {
            return;
        };
        lockReconnect = true;
        //没连接上会一直重连,设置延迟避免请求过多
        tt && clearTimeout(tt);
        tt = setTimeout(function () {
            (function(){
                // console.info("重新连接")
                new MonitorWebSocket(wsUrl);
            })()
            lockReconnect = false;
        }, 5000);
    }
    MonitorWebSocket.prototype.heartCheckStart = function() {
        // console.log('心跳检测开始');
        this.timeoutObj && clearTimeout(this.timeoutObj);
        this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);
        this.timeoutObj = setTimeout(function(){
            //这里发送一个心跳,后端收到后,返回一个心跳消息,
            // console.log('启动心跳');
            ws.send("test");
            this.serverTimeoutObj = setTimeout(function() {
                ws.close();
            }, this.timeout);

        }, this.timeout)
    }
    let linkMarket = new MonitorWebSocket(wsUrl);

归纳与总结

实现心跳检测的思路是:每隔一段固定的时间,向服务器端发送一个ping数据,如果在正常的情况下,服务器会返回一个pong给客户端,如果客户端通过
onmessage事件能监听到的话,说明请求正常,这里我们使用了一个定时器,每隔3秒的情况下,如果是网络断开的情况下,在指定的时间内服务器端并没有返回心跳响应消息,因此服务器端断开了,因此这个时候我们使用ws.close关闭连接,在一段时间后(在不同的浏览器下,时间是不一样的,firefox响应更快),
可以通过 onclose事件监听到。因此在onclose事件内,我们可以调用 reconnect事件进行重连操作。

问题二 如何创建一个Javascript页面来检测用户的互联网速度并在页面上显示它?

知识点: 网速测试方法得核心思想

不管通过什么方式,一般都是通过下载一个文件,然后用文件的大小除以所耗时间,就是你的本地网络速度了。

这里介绍的是一个最常被使用的,又是最简单的方法。

let speed = {
    status: 3,
},
that = this;
function Network () {
    this.speedInterval = null;
    this.networkInterval = null;
    this.reNetworkInterval = null;
    this.time = 5000;
    this.speedStauts = null;
    this.getConnectState = function() {
        return navigator.onLine ? 1 : 0;
    }
    this.getSpeedStauts = function(){
    return this.speedStauts;
    }
}
// 网络速度检测
Network.prototype.startSpeed = function (){
    window.clearInterval(this.speedInterval);
    this.speedInterval = null;
    let that = this;
    if(this.getConnectState() == 1){
        this.speedInterval = window.setInterval(function(){
            let start = new Date().getTime();
            if(that.getConnectState() == 1){
                let img = document.getElementById("networkSpeedImage");
                try{
                img.src = "http://www.baidu.com/img/baidu_jgylogo3.gif?_t=" + new Date().getTime();
                img.onload = function(){
                    let end = new Date().getTime();
                    let delta = end - start;
                    console.info("delta====>",delta)
                    if (delta > 200) {
                    console.info("凑活")
                    speed.status= 1;
                    } else if (delta > 100) {
                    speed.status = 2;
                    } else {
                    speed.status = 3;
                    }
                    console.info("statusSpeed====>",speed.status)
                }
                } catch {
                    speed.status = 0;
                    console.info("网络断开")
                }
            }else {
                speed.status = 0;
                console.info("网络断开2")
            }
        },this.time)
    }else {
        speed.status = 0;
        console.info("网络断开1")
    }
}
let netWork = new Network();

总结

通过创建img对象,设置onload监听回调,然后指定src, 一旦指定src,图片资源就会加载,完成时onload回调就会调用,我们可以根据时机分别标记start和end。

前端判断网速的方法及其优缺点

  • img加载测速:借助img对象加载测算网速。优点:没有跨域带来的问题。缺点:(1)要自己测文件大小并提供参数fileSize,(2)文件必须为图片 (3)文件大小不能灵活控制
  • Ajax测速: 通过Ajax测算网速。 优点: (1)不用提供文件大小参数,因为可以从response首部获得(2)测试的文件不一定要是图片,且数据量能灵活控制。缺点:跨域问题
  • downlink测速: 通过navigator.connection.downlink读取网速。优点:不需要任何参数。缺点:1.兼容性很有问题,2.带宽查询不是实时的,具有分钟级别的时间间隔
    已上都是可以三中方法都可以实现,大家可以考虑个子得项目进行合理得选择

原文地址:https://www.cnblogs.com/qidaoxueyuan/p/12345259.html

时间: 2024-10-09 20:31:58

前端网络监控与断网重链的相关文章

无线网络间歇断网该怎么办?

无论是网络技术的使用还是网咯故障的排查,作为网络管理员我们都应该有一定的了解,那么这里就详细的为我们说明一下.对于无线网络技术,我们有多少人很了解呢?对于无线网络出现的故障,我们这里为大家汇总了一些常见的排除技巧.排查连接方式,解决间歇断网的无线网络故障 在本地局域网通过无线路由器接入到Internet网络中的情形下,要是局域网中的工作站经常出现一会儿能正常上网.一会儿又不能正常上网的故障现象时,我们首先需要确保工作站与无线路由器之间的上网参数一定要正确,在该基础下就应该重点检查无线路由器的连接

Android利用广播监听设备网络连接(断网)的变化情况

MainActivity如下: package cc.testnetworkchange; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * 利用广播监听设备网络连接的变化情况 * 亦可借此监测到设备是否已经断开网络 */ public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedI

h5 网络断网时,返回上一个页面 demo (与检测网络代码相结合,更直观看到结果)

页面一: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>网络在线与离线</title> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maxi

bat实现监测计算机网络连接,断网自动重启网络连接

十月一体验了windows 10预览版之后,决定继续装回正式版,尝个鲜就好了,毕竟预览版还是不稳定,环境不是很方便. 决定装个最新正式版windows 8.1,结果问题来了,无线连接总是失败,显示网络连接受限,断开连接,重新连接就好了.过一会就又断了.... 网上搜了各种办法,有说无线驱动兼容性问题的,换了官网最新驱动,无效.有说设置固定IP的,固定IP,无效.有说勾掉win8"允许计算机关掉此设备以节约电源"的,照做,无效... 各种方法都试了,都无效. 简直点燃了我的小爆脾气.决定

断网不要慌,掌握这两条命令,一分钟就可以定位网络问题

对于局域网而言,断网基本上都是灾难性的,领导.同事立刻唉声占道.催个不停.作为一名网络管理人员,不可避免经常会碰到断网的情况.保持冷静的头脑,迅速的定位问题所在,可以说是一个网管必备的基本素养. 本文中,我将介绍几条dos下的命令,掌握好这几条命令,一分钟内就可以定位断网原因. 1. 首先要看ipconfig 在dos窗口下,输入ipconfig,可以查看到本机"手动设置"或者"自动获取"的IP地址.如图: 这里有几种可能性: IP地址和网关地址都正确.(不存在问题

Ubuntu Wifi网络连接不上或经常断网

参考文章: https://www.cnblogs.com/fengxm/p/5981663.html 我的问题描述:     安装双系统后,使用Ubuntu系统经过一段时间的待机wifi就会扫描不到网络也连不上需要反复执行sudo service network-manager restart才能扫描上wifi,发现了以下的解决方式成功解决问题,希望对你遇到的问题也有一定的帮助. 问题: ubuntu wifi连接不上或经常断网,重启就好 问题1.知道wifi密码,驱动也有,可以点击连接,总是

Ubuntu 16.04安装基于nethogs衍生的网络监控软件(应用实时网速监控)

基于nethogs衍生的网络监控软件有如下所列举的: nettop显示数据包类型,按数据包的大小或数量排序. ettercap是以太网的网络嗅探器/拦截器/记录器 darkstat通过主机,协议等方式分解流量.用于分析在较长时间内收集的流量,而不是“实时”查看. iftop按服务和主机显示网络流量 ifstat以类似vmstat / iostat的方式通过界面显示网络流量 gnethogs基于GTK的GUI(在制品) nethogs-qt基于Qt的GUI hogwatch带有桌面/网络图形的带宽

基于fiddler插件开发的移动测试网络监控与分析

一.背景和目的: 由于目前App前端业务测试很少关注后端网络接口的异常情况,客户端QA在项目测试时往往局限于关注测试功能,导致测试粒度较粗.即使按照CheckList过功能点,客户端QA对后端接口的覆盖情况也很难做到明确把握. Fiddler是我们在客户端测试时使用比较普遍的工具,常用于HTTP抓包.构造请求等等.原生的fiddler插件,缺乏对包大小,网络请求时长.接口访问频次.接口覆盖度等维度进行网络请求的分析,同时提供网速控制的功能,下文介绍开发定制fiddler插件辅助app业务测试.

网络监控为啥建议使用PoE交换机?

随着时代的推进,安防监控的传统监控逐渐被网络监控所取代,随之网络监控成为了监控系统的主流.但接下来却涌现出了很多问题,如网络监控系统的方案如何设计才合理?网络交换机带宽不足引起丢包的问题如何解决?网络摄像机电源布线困难怎么办?所以基于PoE技术的PoE交换机得到了广泛关注和运用. 作为传输设备,PoE交换机除了视频信号传输,还要给前端IPC供电.这就有3个问题:一是供电的功率问题,二是传输距离问题,三是视频码流问题.即便是如此,PoE交换机在现代监控系统中仍然不可或缺. 从用户角度分析:1,用户