HTML5 WebSocket介绍与基本使用(解析服务端返回的二进制数据)

news2025/1/18 13:56:41

WebSocket基本介绍

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

WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。

WebSocket 状态

在上面代码中我们通过WebSocket()构造函数来构造一个ws实例。对应的这个实例中有只读属性 readyState 表示连接状态四个状态,对应的分别有四个不同的值,具体如下:

状态说明
WebSocket.CONNECTING0表示连接尚未建立
WebSocket.OPEN1表示连接已建立,可以进行通信
WebSocket.CLOSING2表示连接正在进行关闭
WebSocket.CLOSED3表示连接已经关闭或者连接不能打开

WebSocket 事件

整个ws建立的过程有四个比较重要的事件,分别是:

  1. open阶段:WebSocket.onopen属性定义一个事件处理程序,当WebSocket 的连接状态readyState 变为1时调用;这意味着当前连接已经准备好发送和接受数据。这个事件处理程序通过 事件(建立连接时)触发
  2. message:message 事件会在 WebSocket 接收到新消息时被触发
  3. close:WebSocket.onclose 属性返回一个事件监听器,这个事件监听器将在 WebSocket 连接的readyState 变为 CLOSED时被调用,它接收一个名字为“close”的 CloseEvent 事件
  4. error:当websocket的连接由于一些错误事件的发生 (例如无法发送一些数据) 而被关闭时,一个error事件将被引发

WebSocket 方法

ws中我们常用的有如下两个方法:

  1. send:使用连接发送数据
  2. close:关闭连接

HTML中建立ws

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>websocket-demo</title>
</head>

<body>

</body>
<script>

  // 建立ws连接
  const wbSocket = () => {
    // ws实例
    let webSocket = null;
    // 检测心跳的间隔ID
    let intervalID = null;
    const connect = async () => {
      // 服务端ws的地址
      const wsUrl = 'ws://10.199.161.17:9010/ws?deviceId=A51a007F-0620-467B-8A4a-c8a6c9aD69FD&protocolVersion=3'
      // https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/readyState
      // CLOSED
      if (webSocket && webSocket.readyState !== 3) {
        return;
      }
      // Create WebSocket connection.
      webSocket = new WebSocket(wsUrl);

      // 连接已经准备好发送和接受数据
      webSocket.addEventListener("open", (event) => {
        webSocket.send("Hello Server, connection has build", event);
      });

      // Listen for messages
      webSocket.addEventListener("message", async (event) => {
        console.log("Message from server: ", event.data);
        const receivedData = event.data;
        if (receivedData instanceof Blob) {
          try {
            const buffer = await event.data.arrayBuffer()
            // 建立DateView对象来读写缓冲区 按照有符号的8位数字读取
            const view = new Int8Array(buffer);
            // 将类数组view转化为数组,方便读取
            const list = Array.from(view)
            console.log(list);
          } catch (error) {
            console.log('解析blob出错', error.message);
          }
        } else {
          console.log('接受到的数据');
        }
      });

      // Listen for possible errors
      webSocket.addEventListener("error", (event) => {
        console.log("WebSocket error: ", event);
      });

      webSocket.addEventListener("close", event => {
        console.log("socket closed ", event.data);
        // 将webSocket 设为Null, 不再发送心跳 等待重新建立连接
        clearInterval(intervalID)
        webSocket = null;
        intervalID = null;
      });
    }
    
    setInterval(() => {
      // 如果有socket实例并且有心跳就直接返回
      if (webSocket && webSocket) return
      // 无ws实力 or 心跳id则建立ws连接
      connect()
    }, 5 * 1000)
  }

  wbSocket()

</script>

</html>

可以看到在上面代码中我们对服务端返回给前端的值做了一层判定,有时服务端在特定的场景下会使用java中的netty这个工具包返回给前端的数据是二进制的,就需要前端判断之后自己再使用arrayBuffer这个API自己转一下。
如果服务端此时返回的是一个正常的数据而非Blob的话,那就可以直接在event.data中获取就可以了。
需要注意一点是ArrayBuffer是一个表示原始二进制数据的缓冲区,是一个字节数组,并不能直接操作ArrayBuffer中的内容。需要通过DataView对象来操作

浏览器中查看ws

在这里插入图片描述
如果打印出上面代码中的buffer的话console.log(111, buffer);会在浏览器如下显示:
在这里插入图片描述
我们点击右侧的那个点之后,会跳转到浏览器的内存检查器,查看对应的值以及存这些值的地址。
在这里插入图片描述

参考资料

WebSocket
HTML5 WebSocket
ArrayBuffer

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

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

相关文章

数据库系统 - 家庭教育平台设计开发

目录 1.绪论 1.1项目背景 1.2家庭教育平台的发展现状与优势 1.2.1国内外发展现状 1.2.2家庭教育平台的优势 2.需求分析 2.1可行性分析 2.1.1经济可行性 2.1.2 技术可行性 2.1.3操作可行性 2.2系统功能 2.2.1 家庭教育资源 2.2.2 家庭教育指导师 2.2.3家庭教育咨询…

H3C-Cloud Lab实验-静态路由配置实验

实验拓扑图&#xff1a; 接口IP地址规划&#xff1a; 实验需求&#xff1a; 1、理解静态路由的运行原理 2、掌握静态路由的配置 实验步骤&#xff1a; PC1和PC2的IP地址、子网掩码、网关 1、连接所有设备并重命名 2、R1&#xff0c;配置R1的接口IP地址&#xff0c;配置3.0、…

042、TiDB特性_系统表的使用

系统表存储位置 MySQL 存储TiDB 系统表 mysql.user 等 information_schmea提供了一种查看系统元数据的方法 与mysql兼容的表&#xff1a;tables、processlist、columns等自定义的表&#xff1a; cluster_config、cluster_hardware、tiflash_replica等等 metrics_schema: 基于P…

Java的数据结构-Map集合

文章目录 Map概述Map常用方法Map遍历元素的方法1.方法一&#xff1a;keySet()2.方法二&#xff1a;entrySet() Map概述 1、Map和collection没有继承关系2、Map集合以key和value的方式存储数据&#xff1a;键值对key和value都是引用数据类型。key和value都是存储对象的内存地址…

ChatGPT:利用人工智能助推教育创新

当前&#xff0c;世界正需要一个更加开放的、更加个性化的学习空间&#xff0c;学生的个性发展和生存发展应该被关注和尊重&#xff0c;课程应该引导学生掌握有用的东西&#xff0c;学生之间的差距应该被正视&#xff0c;教育成功的标准也要被重新定义。过去&#xff0c;我们总…

如何有效利用chatgpt?

如何有效地使用ChatGPT&#xff1f; 代码、诗歌、歌曲和短篇小说都可以由 ChatGPT 以特定的风格编写。您所需要的只是正确的问题和适当的提示。以下是有关如何有效使用ChatGPT的一些提示和想法&#xff1a; 头脑 风暴获取初稿解决编码问题尝试不同的提示格式查找标题寻求帮助…

Docker安装ElasticSearch/ES

目录 前言准备拉取ElasticSearch镜像安装ElasticSearch拉取elasticsearch-head镜像安装elasticsearch-head参考 前言 TencentOS Server 3.1Docker version 19.03.14, build 5eb3275d40 准备 docker 已安装。 安装 docker 参考&#xff1a;【Centos 8】【Centos 7】安装 docke…

XSS简介

OWASP TOP 10 OWASP(开放式Web应用程序安全项目)的工具&#xff0c;文档&#xff0c;论坛额全球各地分会都是开放的&#xff0c;对所有致力于改进应用程序安全的人士开放&#xff0c;最具权威的就是10项目最严重的Web应用程序安全风险列表 Cross Site Scripting&#xff08;X…

基于mediapipe的人脸关键点检测及嘴唇换色demo

Face-mesh(人脸关键点检测及网格绘制) import mediapipe as mp import numpy as np import cv2mp_face_mesh = mp.solutions.face_mesh face_mesh = mp_face_mesh.FaceMesh(static_image_mode=False, # False处理视频,True处理单张图片max_num_faces=1,refine_landmarks=True,…

LayUI之CRUD(增删改查)

目录 一、前期准备 1.数据表格 2.弹出层 3.用户表数据查询 二、用户管理后台编写 三、前端JS编写 四、效果展示 一、前期准备 1.数据表格 在layui官网找到我们需要的数据表格 根据需求复制修改代码&#xff0c;再找到表单复制一个输入框和按钮&#xff0c;做一个搜索功能…

企业级多租户动态分配和共享资源平台——IBM Spectrum Conductor

IBM Spectrum Conductor有何用途 IBM Spectrum Conductor 是一个企业级多租户平台&#xff0c;用于在常用的共享资源集群上部署和管理 Apache Spark、Anaconda、Dask 和其他应用框架和服务。 它能够支持多个并行的不同版本的应用&#xff0c;同时可在租户和应用之间动态分配和…

JavaWeb项目【SpringBoot】——图书项目4.0【源码】:SpringBoot版本 springboot相关技术 项目应用

目录 项目简介思考 & 改进1.Jsp都是同步请求---->改成异步Ajax【完成】2.前端用Jsp技术落后----->用Vue框架【完成】3.架构问题&#xff1a;配置数据和Java代码耦合【完成】3.SQL语句和Java代码耦合【完成】4.架构问题&#xff1a;servlet只能处理一个请求5.响应方式…

原型分析1

对原型的理解又深了一下。之前没考虑 其实所有的函数 都是 new Function 创建的 。所以 函数是 Function 的实例 。而且 Function 的 原型指向自己 。Object也是函数 所以也是 Function 的实例 它的__proto__ 也指向 Function的原型

JavaFX中MVC例子理解

JavaFX可以让你使用GUI组件创建桌面应用程序。一个GUI应用程序执行三个任务&#xff1a;接受用户的输入&#xff0c;处理输入&#xff0c;并显示输出。而一个GUI应用程序包含两个 类型的代码&#xff1a; 领域代码。处理特定领域的数据和遵循业务规范。交互代码。处理用户输入…

Zookeeper集群 + Kafka集群 + Filebeat + ELK

目录 一&#xff1a;Zookeeper 概述 1、Zookeeper 定义 2、Zookeeper 工作机制 3、Zookeeper 特点 4、 Zookeeper 数据结构 5、 Zookeeper 应用场景 6、 Zookeeper 选举机制 &#xff08;1&#xff09;第一次启动选举机制 &#xff08;2&#xff09;非第一次启动选举机制…

Java InetAddress类

【InetAddress类】 【相关方法】 【使用方法实例】 【代码结果】

HUAWEI Mate X3:内外屏双享,折叠影像诠释精彩

HUAWEI Mate X3是全球首款四曲折叠手机&#xff0c;轻薄实力派。它采用了独创的寰宇舷窗设计&#xff0c;内外双屏高清呈现均支持120Hz疾速高刷&#xff0c;10.7亿色彩显示&#xff0c;获得德国莱茵TV色准和准确色彩投射双认证。无论是看视频、玩游戏、办公学习&#xff0c;还是…

山西电力市场日前价格预测【2023-07-15】

日前价格预测 预测明日&#xff08;2023-07-15&#xff09;山西电力市场全天平均日前电价为282.84元/MWh。其中&#xff0c;最高日前电价为546.79元/MWh&#xff0c;预计出现在20: 30。最低日前电价为0.00元/MWh&#xff0c;预计出现在11: 45-14:15。 价差方向预测 1&#xff1…

国产芯片——单片机32位mcu的应用

随着物联网与人工智能和智能制造的发展&#xff0c;单片机作为嵌入式系统的核心控制器&#xff0c;在各类行业应用中占据重要位置。其中32位MCU在芯片设计、制造工艺、封装技术上等取得显著突破&#xff0c;以高性能的技术条件被广泛应用在智能物联等行业的方案开发中。今天我们…

自动脱扣型绝缘靴(手套)耐压支架

一、概述 武汉凯迪正大自动脱扣型绝缘靴&#xff08;手套&#xff09;耐压支架是根据《DLT 976-2017 带电作业工具、装置和设备预防性试验规程》、《DLT 1476-2015电力b2b平台工器具预防性试验规程》、《GBT 17622-2008带电作业用绝缘手套》、《CB21148 2020足部防护 b2b平台鞋…