IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 关于webSocket建立前后端连接,并进行心跳机制的实现 -> 正文阅读

[网络协议]关于webSocket建立前后端连接,并进行心跳机制的实现

最近在做一个后台实时通知的项目,项目中用到了socket来实现前后端建立通信,在此记录一下。

<template>    
	<div>       
		<h1>测试webSocket</h1>
        <div id ="aaa" style="height: 300px; overflow-y: scroll; background: #333; color: #aaa; padding: 10px;"></div>
    </div>
</template>
<script>
	var that;
export default {
    data(){
        return {
            data:0,
            timeout: 30 * 1000,//30秒一次心跳
            timeoutObj: null,//心跳心跳倒计时
            serverTimeoutObj: null,//心跳倒计时
            timeoutnum: null,//断开 重连倒计时
            websocket: null,
        }
	},
	created() { // 页面创建生命周期函数  
        that = this;
		that.initWebSocket()
	},        
	destroyed: function () { // 离开页面生命周期函数              
		that.websocketclose();
	},        
	methods: {            
		initWebSocket: function () {                
			// WebSocket与普通的请求所用协议有所不同,ws等同于http,wss等同于https                
			that.websocket = new WebSocket("wss://127.0.0.1:9231/kh_snmptrap/websocket/lsmsp");
			that.websocket.onopen = that.websocketonopen;
			that.websocket.onerror = that.websocketonerror;
			that.websocket.onmessage = that.setOnmessageMessage;
			that.websocket.onclose = that.websocketclose;
            // 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
            // window.onbeforeunload = that.onbeforeunload
        },
        reconnect: function () { // 重新连接
            if(that.lockReconnect) return;
            that.lockReconnect = true;
            //没连接上会一直重连,设置延迟避免请求过多
            that.timeoutnum && clearTimeout(that.timeoutnum);
            that.timeoutnum = setTimeout(() => {
                //新连接
                that.initWebSocket();
                that.lockReconnect = false;
            }, 5000);
        },
        reset: function () { // 重置心跳
            // 清除时间
            clearTimeout(that.timeoutObj);
            clearTimeout(that.serverTimeoutObj);
            // 重启心跳
            that.start();
        },
        start: function () { // 开启心跳
            that.timeoutObj && clearTimeout(that.timeoutObj);
            that.serverTimeoutObj && clearTimeout(that.serverTimeoutObj);
            that.timeoutObj = setTimeout(() => {
                // 这里发送一个心跳,后端收到后,返回一个心跳消息,
                if (that.websocket && that.websocket.readyState == 1) { // 如果连接正常
                    that.websocketsend('heartbeat');
                } else { // 否则重连
                    that.reconnect();
                }
                that.serverTimeoutObj = setTimeout(() => {
                    //超时关闭
                    that.websocket.close();
                }, that.timeout);

            }, that.timeout)
        },
        setOnmessageMessage: function(event) {
            let obj = JSON.parse(event.data);
            // console.log("obj",obj)
            switch(obj.type) {
                case 'heartbeat':
                    //收到服务器信息,心跳重置
                    that.reset();
                    break;
                case 'sendMessage':
                    that.data = obj.data
                    console.log("接收到的服务器消息:",JSON.stringify(obj.data,null,4))
                    document.getElementById('aaa').innerHTML=JSON.stringify(obj.data,null,4)
            }
        },
		websocketonopen: function () {
            //开启心跳
            that.start();
            console.log("WebSocket连接成功!!!"+new Date()+"----"+that.websocket.readyState);
		},              
		websocketonerror: function (e) {                
			console.log("WebSocket连接发生错误" + e);              
		},              
		websocketonmessage: function (e) {                
			console.log(e.data);                // console.log(e);
            document.getElementById('aaa').innerHTML=e.data
        },
		websocketclose: function (e) {
            that.websocket.close();
            console.log("connection closed ");
		},
        websocketsend(messsage) {
            that.websocket.send(messsage)
        },
        closeWebSocket() { // 关闭websocket
            that.websocket.close()
        }
	}    
}
</script>
<style >
</style>

还有一点,我这里是https的请求,如果你是http请求的话,把wss://127.0.0.1:8888改为ws://127.0.0.1:8888。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:56:30  更:2022-03-16 22:56:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:54:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码