WebSocket真实项目总结

news2024/11/23 22:37:02

websocket

websocket是什么?

websocket是一种网络通讯协议。 websocket 是HTML5开始提供的一种在单个TCP链接上进行全双工通讯的协议。

为什么需要websocket?

初次接触websocket,都会带着疑惑去学习,既然已经有了HTTP协议,为什么还需要另一个协议?它能带来什么好处呢?很简单,因为HTTP协议的通讯只能由客户端发起。
举列来说,我想了解今天的天气,只能是客户端向服务端发出请求,服务器返回查询结果,HTTP协议做不到服务器主动向客户端推送信息。

为什么需要websocket

传统的HTTP协议是无状态的,每次请求request都要由客户端浏览器主动发起,服务端进行处理后返回response结果,而服务端很难主动向客户端发送数据了这种客户端是主动方,服务端是被动方的传统web模式,对于信息变化不频繁的web应用来说造成的麻烦较小,而对于涉及实时信息的web应用却带来了很大的不方便,如带有即时通信,实时数据,订阅推送等功能的应用。

为什么需要websocket

websocket的优势

相对于传统HTTP每次请求-应答都需要客户端与服务端简历连接的模式,websocket是类似socket的TCP长连接通讯模式,一旦websocket连接建立后,后继数据都已帧序列的形式传输,在客户端断开websocket连接活Server端终端连接前,不需要客户端和服务端重新发起连接请求,在海量并发及客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息实在同一个持久连接上发起,实时性优势明显。

websocket实现方式

websocket需要像TCP一样,先建立连接,需要客户端和服务端进行握手连接,连接成功后才能湘湖通信。

websocket构造函数

websocket对象作为一个构造函数,用于新建websocket实例

var ws = new webSocket("ws://127.0.0.1:8090")

执行上面语句之后,客户端就会与服务器进行连接。

webSocket.readyState

readyState属性返回实例对象的当前状态,共有四种。

CONNECTING:值为0,表示正在连接。
OPEN:值为1,标识连接成功,可以通信了。
CLOSING:值为2,标识连接正在关闭。
CLOSED:值为3,标识连接已经关闭,或者打开链接失败。

webSocket.onerror

连接发生错误的回调方法

ws.onerror = function(){
	alert("webSocket连接发生错误“)
}

webSocket.onclose

实例对象的onclose 属性,用于指定关闭连接后的回调函数

ws.onclose = function(){
	alert("websocket连接关闭")
}

webSocket.send()

实例对象的send()方法用于向服务器发送数据

ws.send("your message")

总结完webSocket如何握手及其所有的方法,下面进入实战

使用websocket实现图表数据动态实时更新

websocket 封装的websocket.js代码
/* WebSocket封装
 * @param url: WebSocket接口地址与携带参数必填
 * @param onOpenFunc: WebSocket的onopen回调函数,如果不需要可传null
 * @param onMessageFunc: WebSocket的onmessage回调函数,如果不需要可传null
 * @param onCloseFunc: WebSocket的onclose回调函数,如果不需要可传null
 * @param onErrorFunc: WebSocket的onerror回调函数,如果不需要可传null
 * @param heartMessage: 发送后台的心跳包参数,必填 (给服务端的心跳包就是定期给服务端发送消息)
 * @param timer: 给后台传送心跳包的间隔时间,不传时使用默认值3000毫秒
 * @param isReconnect: 是否断掉立即重连,不传true时不重连
 */
function useWebSocket(
    url,
    onOpenFunc,
    onMessageFunc,
    onCloseFunc,
    onErrorFunc,
    heartMessage,
    timer,
    isReconnect
  ) {
    let isConnected = false; // 设定已链接webSocket标记
    // websocket对象
    let ws = null;
    // 创建并链接webSocket
    let connect = () => {
      // 如果未链接webSocket,则创建一个新的webSocket
      if (!isConnected) {
        ws = new WebSocket(url);
        isConnected = true;
      }
    };
    // 向后台发送心跳消息
    let heartCheck = () => {
      // for (let i = 0; i < heartMessage.length; i++) {
      //   ws.send(JSON.stringify(heartMessage[i]))
      // }
    };
    // 初始化事件回调函数
    let initEventHandle = () => {
      ws.addEventListener('open', (e) => {
        console.log('onopen', e);
        // 给后台发心跳请求,在onmessage中取得消息则说明链接正常
        //heartCheck()
        // 如果传入了函数,执行onOpenFunc
        if (!onOpenFunc) {
          return false;
        } else {
          onOpenFunc(e, ws);
        }
      });
      ws.addEventListener('message', (e) => {
        // 接收到任何后台消息都说明当前连接是正常的
        if (!e) {
          console.log('get nothing from service');
          return false;
        } else {
          // 如果获取到后台消息,则timer毫秒后再次发起心跳请求给后台,检测是否断连
          setTimeout(
            () => {
              if (isConnected) {
                heartCheck();
              }
            },
            !timer ? 3000 : timer
          );
        }
        // 如果传入了函数,执行onMessageFunc
        if (!onMessageFunc) {
          return false;
        } else {
          onMessageFunc(e);
        }
      });
      ws.addEventListener('close', (e) => {
        console.log('onclose', e);
        // 如果传入了函数,执行onCloseFunc
        if (!onCloseFunc) {
          return false;
        } else {
          onCloseFunc(e);
        }
        // if (isReconnect) { // 如果断开立即重连标志为true
        //   // 重新链接webSocket
        //   connect()
        // }
      });
      ws.addEventListener('error', (e) => {
        console.log('onerror', e);
        // 如果传入了函数,执行onErrorFunc
        if (!onErrorFunc) {
          return false;
        } else {
          onErrorFunc(e);
        }
        if (isReconnect) {
          // 如果断开立即重连标志为true
          // 重新链接webSocket
          connect();
        }
      });
    };
    // 初始化webSocket
    // (() => {
    // 1.创建并链接webSocket
    connect();
    // 2.初始化事件回调函数
    initEventHandle();
    // 3.返回是否已连接
    return ws;
    // })()
  }
  
  export default {
    useWebSocket,
  };
  
  

调用方法并建立连接使用:(当连接失败后,进行websocket重连)

initWebSocket() {
      if(!this.ws) {
      	// url
        let url = 'ws://XXX.XXX.XXX.XXX:4002/websocket/11111'
        this.ws = websocket.useWebSocket(
          url,	// url
          this.wsOnOpen, // 链接回调
          this.wsOnMessage,	// 连接成功后处理接口返回信息
          this.wsOnClose, // 关闭回调
          this.wsOnError, // 消息通知错误回调
          [], // 发送后台的心跳包参数
          null, // 给后台传送心跳包的间隔时间
          true, // 是否断掉立即重连
        );
      }
    },
    wsOnOpen() {
      console.log('开始连接')
    },
    wsOnError(e) {
      console.log(e,'消息通知错误回调,重新连接')
      this.ws.close();
      this.ws = null;
      this.initWebSocket();
    },
    wsOnMessage(e) {
      if(e.data != '连接成功') {
		    console.log(JSON.parse(e.data),'接口返回信息')
      }
    },
    wsOnClose() {
      console.log('关闭')
      // 意外关闭之后重新连接
      if(!this.disConnectTimer) {
        this.disConnectTimer = setTimeout(() => {
          this.initWebSocket()
          this.disConnectTimer = null
        }, 10000)
      }
    },

实现效果:
websocket实时图表
重连效果
websocket关闭重连效果
完结~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1207239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

千兆光模块和万兆光模块的安装和维护指南

光模块是网络通信中不可或缺的设备&#xff0c;安装和维护的重要性不能被忽视。本文将为您详细介绍千兆光模块和万兆光模块的安装和维护指南&#xff0c;帮助您更好地了解光模块的应用和维护技巧&#xff0c;从而为您的网络通信体验提供优质保障。 一、光模块简介 作为网络通…

CSS实现图片滑动对比

实现效果图如下&#xff1a; css代码&#xff1a; 知识点&#xff1a;resize: horizontal; 文档地址 <style>.image-slider {position: relative;display: inline-block;width: 500px;height: 300px;}.image-slider>div {position: absolute;top: 0;bottom: 0;left: …

有什么方法可以改善CRM实施投资回报?

数据统计显示&#xff0c;几乎70%以上CRM客户管理系统项目的投资回报是负数。这意味着超过半数的CRM项目的结果是失败的。那么我们有什么方法可以改善CRM实施投资回报吗&#xff1f;当然有&#xff0c;下面我们就来说一说。 如何改善CRM实施投资回报 首先&#xff0c;您选择的…

概念解析 | 费马路径

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:费马路径 费马路径: Fermat Path & 费马原理 背景介绍 在异质光学介质中,光线传播呈现出折射的行为。由于光速在不同介质中有所不同,光线在经过界面时,其路径也会发生偏转…

需要买哪些网络设备才能过等保?求解!

随着等保2.0的落地执行&#xff0c;越来越多的企业需要过等保。但不少企业都是第一次过等保&#xff0c;对于等保政策不是很了解&#xff0c;有小伙伴问&#xff0c;需要买哪些网络设备才能过等保&#xff1f;这里我们小编就给大家来简单回答一下&#xff0c;仅供参考哈&#x…

编程实例与解释,编程入门自学指南,中文编程工具下载

编程实例与解释&#xff0c;编程入门自学指南&#xff0c;中文编程工具下载。 编程实例可以点击最下方卡片了解&#xff0c;编程入门自学可以先从容易的入手&#xff0c;比如中文编程&#xff0c;先学习编程思路&#xff0c;然后再学习其他语言会比较轻松。中文编程工具可以下…

【java学习—十三】处理流之六:对象流(5)

文章目录 1. ObjectInputStream 和 OjbectOutputSteam2. 对象的序列化 假设有一个Person对象 把这个对象存到电脑的硬盘上&#xff0c;硬盘存储的基础是什么&#xff1f;&#xff08;二进制&#xff09;。那就需要把对象转化为一个二进制的字节流&#xff0c;把这个流保存到电脑…

园区网络项目实战

实验背景 某写字楼备搭建一张网络供楼内企业办公使用。写字楼共6层&#xff0c;目前已有三层投入使用&#xff0c;分别 是一层会客大厅、二层行政部及总经理办公室、三层研发部和市场部。一层设有核心机房&#xff0c;其 他各楼层均有一个小房间放置网络设备。 第一步 询…

出入库管理系统vue2前端开发服务器地址配置

【精选】vue.config.js 的完整配置&#xff08;超详细&#xff09;_vue.config.js配置_web学生网页设计的博客-CSDN博客 本项目需要修改两处&#xff1a; 1、vue开发服务器地址&#xff1a;config\index.js use strict // Template version: 1.3.1 // see http://vuejs-templa…

中国1024程序员节·上海站纪实

目录 前言 活动前奏 盛大开幕 技术交流与分享 彩蛋 游戏互动环节 番外篇&#xff1a;上海站活动安排 结束语 前言 1024 程序员节是专属开发者的节日&#xff0c;他们以“码”为梦&#xff0c;在技术世界中“程”风破浪。作为 2023 长沙中国 1024 程序员节的重要组成部分…

系统无法访问提示“配额不足无法处理此命令“的解决思路

一些老的电脑系统会出现 电脑系统出现无法访问C:Documents and SetAdministrator桌面&#xff0c;配额不足。 解决思路如下 1、电脑的开始菜单的工具栏&#xff0c;选择运行。 2、输入栏中写入命令“gpedit.msc”。 3、弹出组策略窗口&#xff0c;选择打开“计算机配置”—“…

2024郑州光伏展|郑州储能展|郑州国际太阳能光伏储能展览会

2024第四届中国&#xff08;郑州&#xff09;太阳能光伏及储能产业展览会 时间&#xff1a;2024年4月8-10日 地点&#xff1a;郑州.中原国际博览中心 随着人们对环境保护意识的不断提高&#xff0c;太阳能光伏和储能技术在能源领域的应用越来越广泛。为了更好地推广和应用太…

11-8 Spring入门

把Mybatis相关的内容怎么跟service进行调用&#xff0c;mybatis的底层全部由spring帮我创建 把之前所有的MybatisUtil全部干掉&#xff0c;以及我获取对象我都不自己new了&#xff0c;让Spring帮我做 Spring开始1 之前学的mybatis是用于解决一层的问题&#xff08;dao层&…

PDF翻页电子书制作教程,超简单噢~

PDF翻页电子书是一种可以在电脑、平板或手机上阅读的电子书&#xff0c;只要有网&#xff0c;可随时随地查看的&#xff0c;并且它还可以模拟真实的翻页效果&#xff0c;给读者展示出更好的阅读体验。那么&#xff0c;PDF翻页电子书如何制作呢&#xff1f; 其实制作这种PDF翻页…

SARAS算法

SARAS算法 代码仓库:https://github.com/daiyizheng/DL/tree/master/09-rl Sarsa算法是一种强化学习算法&#xff0c;用于解决马尔可夫决策过程&#xff08;MDP&#xff09;问题。它是一种基于值函数的方法&#xff0c;可以用于学习最优策略。本文将介绍Sarsa算法的流程。 S…

nginx 无法 停止

一、nginx正常停止命令 进入到nginx目录&#xff0c;然后执行 # 立即停止 nginx -s stop # 平滑停止 nginx -s quit 二、 如果你不小心启动了多次nginx.exe 那么通过任务管理器可以停止 三、如果 任务管理器无法停止 那么就在cmd命令中执行 netstat -ano //查看所以端口…

一文图解爬虫姊妹篇(spider)

—引导语 爬虫&#xff0c;没有一个时代比当前更重视它。一个好的爬虫似乎可以洞穿整个互联网&#xff0c;“来装满自己的胃”。 接上一篇&#xff1a;一文图解爬虫&#xff08;spider&#xff09; 博主已初步对爬虫的“五脏六腑”进行了解剖。虽然俗称“爬虫”&#xff0c;但窃…

【Python】Matplotlib(学习笔记)

一、Matplotlib概述 1、什么是Matplotlib 画二维图表的python库 2、Matplotlib图像结构 3、Matplotlib三层结构 容器层 > 画板层Canvas、画布层Figure、绘图区/坐标系&#xff08;x、y轴张成的区域&#xff09; 辅助显示层 图像层 二、基础绘图功能 1、模块导入 ma…

gin索引 btree索引 gist索引比较

创建例子数据 postgres# create table t_hash as select id,md5(id::text) from generate_series(1,5000000) as id; SELECT 5000000postgres# vacuum ANALYZE t_hash; VACUUMpostgres# \timing Timing is on. postgres# select * from t_hash limit 10;id | …

SAP 63策略测试简介

在之前的文章中我们又测试了60的策略,接下来我们测试一下63的策略,看看两者之间有什么区别。 首先我们先对比一下系统方面的配置 我们可以看到60策略和63策略中的独立需求的配置是一样的。只在客户需求配置方面有些区别,接下来就开始我们的测试 1、首先我们还是先创建物料…