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

这篇具有很好参考价值的文章主要介绍了HTML5 WebSocket介绍与基本使用(解析服务端返回的二进制数据)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

WebSocket基本介绍

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

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

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

WebSocket 状态

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

状态 说明
WebSocket.CONNECTING 0 表示连接尚未建立
WebSocket.OPEN 1 表示连接已建立,可以进行通信
WebSocket.CLOSING 2 表示连接正在进行关闭
WebSocket.CLOSED 3 表示连接已经关闭或者连接不能打开

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

HTML5 WebSocket介绍与基本使用(解析服务端返回的二进制数据),javaScript,html5,websocket,前端
如果打印出上面代码中的buffer的话console.log(111, buffer);会在浏览器如下显示:
HTML5 WebSocket介绍与基本使用(解析服务端返回的二进制数据),javaScript,html5,websocket,前端
我们点击右侧的那个点之后,会跳转到浏览器的内存检查器,查看对应的值以及存这些值的地址。
HTML5 WebSocket介绍与基本使用(解析服务端返回的二进制数据),javaScript,html5,websocket,前端

参考资料

WebSocket
HTML5 WebSocket
ArrayBuffer文章来源地址https://www.toymoban.com/news/detail-609674.html

到了这里,关于HTML5 WebSocket介绍与基本使用(解析服务端返回的二进制数据)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【温故而知新】HTML5 WebSocket

    HTML5是HTML的最新版本,它引入了许多新的元素和功能,以适应现代网页开发的需求。以下是HTML5的一些主要特点: 新增语义元素 :HTML5引入了许多新的语义元素,如 header、footer、article、section 等,这些元素有助于提高网页的结构化和可访问性。 媒体支持 :HTML5引入了 audio 和

    2024年01月18日
    浏览(33)
  • WebSocket 的介绍及基本使用

    什么是 websocket ? https://websocket.org/ 是一种网络通信协议,和 HTTP 协议 一样。 为什么需要websocket ? 因为 HTTP 协议有一个缺陷:通信只能由客户端发起。 了解 websocket api含义 基于原生的 websocket 完成服务端和客户端的通讯 在做客户端和服务端 通讯业务时,可以采用使用一种前

    2024年02月11日
    浏览(25)
  • 前端-01Html5基本知识

    内容 使用浏览器打开 浏览器 谷歌浏览器 清缓存 ctrl+shift+delete vscode 生成浏览器文件.html的快捷方式 !+回车 常用快捷键 快速打开浏览器 插件open in browser 安装,就会多出两个选项来 概念 是一种用来描述网页的一种语言,被称为超文本标记语言,本质是标记语言,标记语言是

    2024年02月04日
    浏览(37)
  • Web端服务器推送技术原理分析及dwr框架简单的使用,html5移动web开发

    缺点  : a) 糟糕的用户体验 b) 对服务器的压力很大,并且造成带宽的极大浪费。 2.2 Ajax 轮询 Ajax隔一段时间(通常使用JavaScript的setTimeout函数)就去服务器查询是否有改变,从而进行增量式的更新。但是间隔多长时间去查询成了问题,因为性能和即时性造成了严重的反比

    2024年04月16日
    浏览(39)
  • 利用HTML5存储对象:localStorage和sessionStorage解析

    前端朋友们,你是否曾为如何在用户的浏览器中存储数据而感到困扰?你是否想过,如果可以在用户的浏览器中存储一些数据,那么我们的应用程序将会变得多么强大?如果你的答案是肯定的,那么本文将为你解锁一种新的能力——使用HTML5的localStorage和sessionStorage。 HTML5引入

    2024年02月05日
    浏览(26)
  • html的form标签的基本介绍及使用

    目录 前言 1.什么是form标签 1.1 基本介绍 1.2 form标签的相关属性 1.2.1 action属性 1.2.2 method属性 1.2.3 name属性 2.form标签的元素 2.1 input元素 2.1.1 text  2.1.2  password  2.1.3 submit  2.1.4 radio 2.1.5 checkbox 2.1.6 button 2.1.7  html5新增的属性 2.2 input元素的其他属性 2.2 select元素(下拉列表)与

    2024年02月04日
    浏览(22)
  • 零基础学习HTML5(各标签语法介绍)

    vscode + 谷歌浏览器 vscode下载地址:https://code.visualstudio.com/ 谷歌可以使用360软件管家安装 在vscode中安装插件: open in browser ,点击Extensions后搜索对应插件名然后点击安装Install 安装完成后可在html文件中右键多了两个选择: 或者安装 live server 插件,然后右键选择 Open with live

    2024年02月07日
    浏览(33)
  • PHPStudy+HTML5数据库连接详细介绍/数据前后端交互

        数据库的连接想必是让小伙伴们头疼的一件事,这篇文章小编将为大家详细介绍使用PHPStudy连接数据库的详细步骤、调试运行以及代码讲解。     首先我们需要准备的软件有:phpstudy_pro(小白)、PhpStorm 2021.1.2 x64(其他版本也可以)。要连接的数据库是phpstudy_pro中自带的

    2024年02月05日
    浏览(39)
  • HTML5——基础知识及使用

    html 标签是整个 html 文件的根标签(最顶层标签). head 标签中写页面的属性. body 标签中写的是页面上显示的内容. title 标签中写的是页面的标题. HTML 代码是由 “标签” 构成的. 例如: body hello /body 标签名 (body) 放到 中. 大部分标签成对出现. body 为开始标签, /body 为结束标签. 少

    2024年02月16日
    浏览(27)
  • HTML5中使用video标签

    隐藏下载: nodownload 隐藏播放速度: noplaybackrate 隐藏画中画: disablePictureInPicture=\\\"true\\\" 隐藏三个点: controlslist=\\\"nodownload noplaybackrate\\\" 隐藏音量按钮:

    2024年02月07日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包