【学习随记】ws

<template>
    <div class="ws">

        <!-- <input id="name" value="" placeholder="用户名"> -->
        <!-- <button id="login" type="button" @click="login(wsUrl)" value="">登陆</button> -->
        <!-- <br/><br/> -->
        <p>{{onTxt}}</p>
        <input id="data" v-model="message" placeholder="请输入消息">
        <button type="button" @click='wsSend();'>发送消息</button>
        <p class="holdTxt">{{message}}</p>
        <!-- <br/><br/> -->
        <div id="info">

        </div>

    </div>    
</template>
<script>
export default {
    data(){
        return {

            // 测试 ws 在线地址
            // wsUrl: 'ws://121.40.165.18:8800',    // http://www.websocket-test.com/
            

            // wsUrl: 'ws://123.207.136.134:9010/ajaxchattest',    // http://coolaf.com/tool/chattest
            

            // wsUrl: 'ws://echo.websocket.org',   // 参考 http://www.bejson.com/httputil/websocket/
            wsUrl: 'wss://echo.websocket.org',  // 参考 https://www.toolfk.com/tool-online-runwebsocket



            // WebSocket 相关 start
            message: '',
            onTxt: '',
            lockReconnect: false,
            ws: null,

            //心跳检测
            heartCheck: {
                timeout: 10000,        //发一次心跳时间
                timeoutObj: null,
                serverTimeoutObj: null,
                reset: function(){
                    clearTimeout(this.timeoutObj);
                    clearTimeout(this.serverTimeoutObj);
                    return this;
                },
                start: function(enWs){
                    var that = this;
                    this.timeoutObj = setTimeout(function(){
                        //这里发送一个心跳,后端收到后,返回一个心跳消息,
                        //onmessage拿到返回的心跳就说明连接正常
                        enWs.send("ping");
                        console.log("ping! —— 发出心跳");
                        that.serverTimeoutObj = setTimeout(function(){//如果超过一定时间还没重置,说明后端主动断开了
                            enWs.close();     //如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
                            console.log("后端断开了");
                        }, that.timeout)
                    }, this.timeout)
                }
            }
            // WebSocket 相关 end
            


        }
    },
    filters: {
        
    },
    methods: {

        // 格式化时间 返回: "2019/01/01 01:02:03" 时间格式
        // 传入时间戳:格式化 / 不传参:返回当前时间
        formatTime(timestamp) {
            let nowDate;
            timestamp ? nowDate = new Date(timestamp) : nowDate = new Date()
            let Y = nowDate.getFullYear() + '/';
            let M = (nowDate.getMonth() + 1 < 10 ? '0' + (nowDate.getMonth() + 1) : nowDate.getMonth() + 1) + '/';
            let D = nowDate.getDate() + ' ';
            let h = nowDate.getHours() + ':';
            let m = nowDate.getMinutes() + ':';
            let s = nowDate.getSeconds();
            return Y + M + D + h + m + s;
        },
        
        // login(url) {
        //     let that = this;
        //     console.log('login--url: ', url)
        //     if (!that.ws) {
        //         console.log('if');
        //         var user = document.getElementById("name").value;
        //         try {
        //             console.log('try'); 
        //             that.ws = new WebSocket('ws://123.207.167.163:9010/ajaxchattest');
        //             console.log('that.ws', that.ws); 

        //             that.ws.onopen = function (event) {
        //                 console.log("onopen 已经与服务器建立了连接...", event);
        //                 console.log("登陆成功,可以开始聊天了")
        //             };
        //             that.ws.onmessage = function (event) {
        //                 console.log("onmessage 接收到服务器发送的数据...", event);

        //                 // let data = event.data.split(' [');
        //                 // console.log('data', data);

        //                 document.getElementById("info").innerHTML += event.data + "<br>";
        //             };
        //             that.ws.onclose = function (event) {
        //                 console.log("onclose 已经与服务器断开连接...", event);
        //             };
        //             that.ws.onerror = function (event) {
        //                 console.log("onerror WebSocket异常!", event);
        //             };
        //         } catch (ex) {
        //             console.log('try', ex.message);
        //         }
        //         document.getElementById("login").innerHTML = "退出";
        //     } else {
        //         console.log('else')
        //         that.ws.close();
        //         that.ws = null;
        //     }
        // },

        // SendData() {
        //     var data = document.getElementById("data").value;
        //     try {
        //         this.ws.send(data);
        //     } catch (ex) {
        //         console.log(ex.message);
        //     }
        // },


        initWs(url) {
            let that = this;
            console.log("initWs_wsUrl:", url);
            try{
                console.log("initWs_try");
                if(typeof WebSocket != 'undefined'){
                    console.log("您的浏览器支持websocket协议!");
                    that.ws = new WebSocket(url);
                    // that.initEventHandle();
                    console.log('readyState', that.ws.readyState);

                    that.ws.onclose = function (e) {
                        console.log("WS_onclose: ", e);
                        console.log('WS_onclose--readyState', that.ws.readyState);
                        that.reconnect(that.wsUrl);
                        console.log("连接关闭!", that.formatTime());
                        that.onTxt = '连接--no--关闭!'
                    };
                    that.ws.onerror = function (e) {
                        console.log("WS_onerror: ", e);
                        console.log('WS_onerror--readyState', that.ws.readyState);
                        that.reconnect(that.wsUrl);
                        console.log("连接错误!", that.formatTime());
                        that.onTxt = '连接--error--错误!'
                    };
                    that.ws.onopen = function (e) {
                        console.log("WS_onopen: ", e);
                        console.log('WS_onopen--readyState', that.ws.readyState);
                        that.heartCheck.reset().start(that.ws);      //心跳检测重置
                        console.log("连接成功!", that.formatTime());
                        that.onTxt = '连接--ok--成功!'
                    };
                    that.ws.onmessage = function (res) {    //如果获取到消息,心跳检测重置
                        that.heartCheck.reset().start(that.ws);      //拿到任何消息都说明当前连接是正常的
                        console.log('WS_onmessage--readyState', that.ws.readyState);

                        // console.log("收到消息!", that.formatTime(), res);
                        let reg = /^ping/;
                        if(!reg.test(res.data)){ // 非心跳消息
                            console.log("消息如下: ");
                            console.log(res);
                            that.msgHandle(res);
                        }
                        // else{
                        //     console.log("res.data", res.data)
                        // }
                    };

                }
                // else if('MozWebSocket' in window){
                //     console.log("您的浏览器支持websocket协议!");
                //     that.ws = new MozWebSocket(url);
                // }
                else{
                    console.log("您的浏览器--不--支持websocket协议!");
                }
                
            } catch (e){
                that.reconnect(that.wsUrl);
                console.log('initWs_catch: ', e);
            }     
        },

        // initEventHandle() {
        //     let that = this;
        //     that.ws.onclose = function (e) {
        //         console.log("onclose: ", e);
        //         that.reconnect(wsUrl);
        //         console.log("连接关闭!", that.formatTime());
        //     };
        //     that.ws.onerror = function (e) {
        //         console.log("onerror: ", e);
        //         that.reconnect(wsUrl);
        //         console.log("连接错误!", that.formatTime());
        //     };
        //     that.ws.onopen = function (e) {
        //         console.log("onopen: ", e);
        //         that.heartCheck.reset().start();      //心跳检测重置
        //         console.log("连接成功!", that.formatTime());
        //     };
        //     that.ws.onmessage = function (res) {    //如果获取到消息,心跳检测重置
        //         that.heartCheck.reset().start();      //拿到任何消息都说明当前连接是正常的
        //         console.log("收到消息!", that.formatTime());
        //         if(res.data != 'pong'){ // 非心跳消息
        //             console.log("非心跳消息如下: ", res);

        //         }
        //     };
        // },

        reconnect(url) {
            console.log("进入重连方法");
            if(this.lockReconnect) return;
            this.lockReconnect = true;
            setTimeout(()=> {     //没连接上会一直重连,设置延迟避免请求过多
                this.initWs(url);
                this.lockReconnect = false;
            }, 2000);
        },

        wsSend(){
            let data = this.message;
            console.log("send data: ", data);

            if(this.ws.readyState===1){
                console.log("OK--当前状态", this.ws.readyState);
                this.ws.send(data);
            }else{
                console.log("NO--当前状态", this.ws.readyState);
            }
                        
            this.message = ''
        },

        msgHandle(res){
            console.log("msgHandle —— data 消息:", res.data);

            document.getElementById("info").innerHTML += res.data + "<br>";

        },

        closeWs(){
            this.ws.close();
            this.heartCheck.reset();
            console.log("退出页面——关闭ws");
        },

        
        

        

    },
    mounted(){
        console.log("hello  ws");

        this.initWs(this.wsUrl);
        
    },
    beforeDestroy() {

    },
    destroyed() {
        if(this.ws){
            this.closeWs();
        }

    },
}
</script>

<style type="text/css" scoped>

.ws{
    padding-top: 1.5rem;
}

#info{
    width: 80%;
    min-height: 1rem;
    line-height: .4rem;
    margin: 0 auto;
    padding: .15rem;
    text-align: left;
    border: 1px solid #ccc;
}

.holdTxt{
    height: .4rem;
    margin-bottom: .1rem;
    padding: 0 .5rem;
    text-align: left;
    background: #eee;
}





</style>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 目标检测的定义 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 目标检测任务可分为两个关键的子任务,目标定位和目标分类。首先检测图像中目标的位置(目标定位),然后给出每个目标的具体类别(目标分类)。输出结果是一个边界框(称为Bounding-box,一般形式为(x1,y1,x2,y2),表示框的左上角坐标和右下角坐标),一个置信度分数(Confidence Score),表示边界框中是否包含检测对象的概率和各个类别的概率(首先得到类别概率,经过Softmax可得到类别标签)。 1.1 Two stage方法 目前主流的基于深度学习的目标检测算法主要分为两类:Two stage和One stage。Two stage方法将目标检测过程分为两个阶段。第一个阶段是 Region Proposal 生成阶段,主要用于生成潜在的目标候选框(Bounding-box proposals)。这个阶段通常使用卷积神经网络(CNN)从输入图像中提取特征,然后通过一些技巧(如选择性搜索)来生成候选框。第二个阶段是分类和位置精修阶段,将第一个阶段生成的候选框输入到另一个 CNN 中进行分类,并根据分类结果对候选框的位置进行微调。Two stage 方法的优点是准确度较高,缺点是速度相对较慢。 常见Tow stage目标检测算法有:R-CNN系列、SPPNet等。 1.2 One stage方法 One stage方法直接利用模型提取特征值,并利用这些特征值进行目标的分类和定位,不需要生成Region Proposal。这种方法的优点是速度快,因为省略了Region Proposal生成的过程。One stage方法的缺点是准确度相对较低,因为它没有对潜在的目标进行预先筛选。 常见的One stage目标检测算法有:YOLO系列、SSD系列和RetinaNet等。 2 常见名词解释 2.1 NMS(Non-Maximum Suppression) 目标检测模型一般会给出目标的多个预测边界框,对成百上千的预测边界框都进行调整肯定是不可行的,需要对这些结果先进行一个大体的挑选。NMS称为非极大值抑制,作用是从众多预测边界框中挑选出最具代表性的结果,这样可以加快算法效率,其主要流程如下: 设定一个置信度分数阈值,将置信度分数小于阈值的直接过滤掉 将剩下框的置信度分数从大到小排序,选中值最大的框 遍历其余的框,如果和当前框的重叠面积(IOU)大于设定的阈值(一般为0.7),就将框删除(超过设定阈值,认为两个框的里面的物体属于同一个类别) 从未处理的框中继续选一个置信度分数最大的,重复上述过程,直至所有框处理完毕 2.2 IoU(Intersection over Union) 定义了两个边界框的重叠度,当预测边界框和真实边界框差异很小时,或重叠度很大时,表示模型产生的预测边界框很准确。边界框A、B的IOU计算公式为: 2.3 mAP(mean Average Precision) mAP即均值平均精度,是评估目标检测模型效果的最重要指标,这个值介于0到1之间,且越大越好。mAP是AP(Average Precision)的平均值,那么首先需要了解AP的概念。想要了解AP的概念,还要首先了解目标检测中Precision和Recall的概念。 首先我们设置置信度阈值(Confidence Threshold)和IoU阈值(一般设置为0.5,也会衡量0.75以及0.9的mAP值): 当一个预测边界框被认为是True Positive(TP)时,需要同时满足下面三个条件: Confidence Score > Confidence Threshold 预测类别匹配真实值(Ground truth)的类别 预测边界框的IoU大于设定的IoU阈值 不满足条件2或条件3,则认为是False Positive(FP)。当对应同一个真值有多个预测结果时,只有最高置信度分数的预测结果被认为是True Positive,其余被认为是False Positive。 Precision和Recall的概念如下图所示: Precision表示TP与预测边界框数量的比值 Recall表示TP与真实边界框数量的比值 改变不同的置信度阈值,可以获得多组Precision和Recall,Recall放X轴,Precision放Y轴,可以画出一个Precision-Recall曲线,简称P-R
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值