在浏览器中使用websocket协议

在浏览器中使用websocket协议

浏览器中提供了 WebSocket 类,我们可以直接使用:

new WebSocket((url: string | URL, protocols?: string | string[] | undefined))
  • url:指定连接的 URL,只支持 ws、wss 协议,否则会提示 DOMException 异常。
  • protocols 是可选的,指定了可接受的子协议,如果设置了子协议,那么服务端必须反馈接收了其中一个子协议,否则无法建立连接。
const ws = new WebSocket(`ws://localhost:3000`, ['sub-protocol', 'sub-protocol2']);

在这里插入图片描述
WebSocket 协议本质上是一个基于 TCP 的协议。

为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP GET 请求:

在这里插入图片描述

这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,其中附加头信息 “Upgrade: WebSocket” 表明这是一个申请协议升级的 HTTP 请求:

在这里插入图片描述

服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的 WebSocket 连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接。

可监听事件

  • open:连接建立时触发。
  • message:客户端接收服务端数据时触发。
  • error:通信发生错误时触发。
  • close: 连接关闭时触发。

事件添加

  • on[eventName] = fn:WebSocket 提供了 onopen、onerror、onclose、onmessage 属性,通过赋值一个函数回调,即可实现事件监听。
    const ws = new WebSocket(`ws://localhost:3000`, ['sub-protocol', 'sub-protocol2']);
    ws.onopen = function(e) {}
    ws.onerror = function(e) {}
    ws.onclose = function(e) {}
    ws.onmessage = function(e) {}
    
    不过这种情况下,不能给同一事件添加多个监听器(后者会替换掉前者)。
    ws.onopen = function(e) { console.log('open') };
    ws.onopen = function(e) { console.log('open2') }
    // 输出
    // open2
    
  • addEventListener(eventName, cb):WebScoket 继承 EventTarget,实现了 addEventListener 方法,也可以通过 addEventListener 来添加监听器。
    const ws = new WebSocket(`ws://localhost:3000`, ['sub-protocol', 'sub-protocol2']);
    const open1 = function() {
      console.log('open1')
    }
    const open2 = function() {
      console.log('open2')
    }
    ws.addEventListener('open', open1)
    ws.addEventListener('open', open2)
    
    使用这种方法可以给同一个事件添加多个监听器。

事件移除

  • on[eventName] = null:直接将 onopen、onerror、onclose、onmessage 这些属性设置成 null 即可。

  • removeEventListener(eventName, cb):WebScoket 继承 EventTarget,实现了 removeEventListener方法,也可以通过 removeEventListener 来移除通过 addEventListener 添加监听器(不能移除 on[eventName] = fn 添加的监听器)。

    const open2 = function() {
      console.log('open2')
    }
    ws.addEventListener('open', open2)
    ws.removeEventListener('open', open2)
    

属性

  • url:返回当前连接 ws 的地址。
  • readyState(只读):表示连接状态,有以下几种可能:
    • 0: 默认,表示连接尚未建立。
    • 1: 表示连接已建立,可以进行通信,触发 open 事件。
    • 2: 表示连接正在进行关闭。
    • 3: 表示连接已经关闭或者连接不能打开。
  • bufferedAmount(只读):已被 send() 放入正在队列中等待传输,但是还没有发出的 UTF-8 文本 或者 二进制 字节数。如果连接已经关闭了,但是仍调用 send 方法,那么这个字节数会继续累计,不会因为断开连接而重置为0
  • extensions(只读):返回服务端选中的后缀。
  • protocol(只读):返回服务端选中的子协议。
  • binaryType:设置 socket 暴露给 js 的消息是什么格式的。默认是 blob,还有一种方式是 arraybuffer
  • onopen:EventHandler 对象,对应 open 事件。
  • onmessage:EventHandler 对象,对应 message 事件。
  • onerror:EventHandler 对象,对应 error 事件。
  • onclose:EventHandler 对象,对应 close 事件。

方法

  • send(data):发送数据(data),数据可以是 字符串、blob、arrayBuffer 或者 arrayBufferView.

  • close([ code ] [, reason ]):关闭连接,可以手动传递状态码及描述。

    • code:状态码(整数)
      1. 如果没有设置 code,默认是1000,或者是会按照 标准设置 1001 - 1015 之间的数字 返回响应的 code 及 reason。
      2. 如果设置了 code,那么会覆盖掉自动设置的,可设置的范围为 3000 - 4999。如果设置了 code,还需要设置 reason。
        比如说设置了code 为 1111,会提示错误:
        在这里插入图片描述
    • reason: 字节数不能超过 123 字节,否则会报错,此时连接未断开。
      在这里插入图片描述

    当 ws 连接未成功建立就调用 close 方法时,会导致连接异常,并将 readyState 设置成 3。
    当 ws 连接正在关闭或者已经断开(readyState 为 2 或者 3)的时候调用 close 方法,不会报错,也不会执行任何东西。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Transformer总结

1.Transform背景介绍 1.1Transform的优势 相比于之前占领市场的LSTM和GRU模型,Transformer有两个显著的优势: (1)Transform能够使用分布式GPU进行并行训练,提升模型训练效率 (2) 在分析预测…

springboot280基于WEB的旅游推荐系统设计与实现

旅游推荐系统设计与实现 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装旅游推荐系统软件来发挥其高效地信息处理…

Tensorflow2.0 - 链式法则例子

本笔记简单记录链式法则的原理,关于链式法则,本身和高等数学中的链式求导法则是一样的,深度学习中相关资料可以参考这里: 【深度学习之美22】BP算法详解之链式法则 - 知乎10.5 什么是计算图?我们知道, 神经…

SpringBoot(拦截器+文件上传)

文章目录 1.拦截器1.基本介绍2.应用实例1.去掉Thymeleaf案例中使用session进行权限验证的部分2.编写自定义拦截器 LoginInterceptor.java 实现HandlerInterceptor接口的三个方法3.注册拦截器1.第一种方式 配置类直接实现WebMvcConfigurer接口,重写addInterceptors方…

RBAC用户权限控制

用资源和操作绑定角色,角色绑定用户和操作 对应 两两绑定需要中间表来绑定 RestController public class UserAuthApi {Autowiredprivate UserSupport userSupport;Autowiredprivate UserAuthService userAuthService;GetMapping("/user-authorities")pu…

使用Navicat远程连接Linux中的MySQL

一、登录MySQL数据库 mysql -uroot -pXjm123456 二、使用mysql数据库 use mysql; 三、查询user表中包含host的字段 select user,host from user;### 该字段中,localhost表示只允许本机访问,可以将‘localhost’改为‘%’,‘%’表…

汇总全网免费API,持续更新(新闻api、每日一言api、音乐。。。)

Public&FreeAPI 网址:apis.whyta.cn (推荐) UomgAPI 网址:https://api.uomg.com 教书先生 网址:https://api.oioweb.cn/ 山海API https://api.shserve.cn/ 云析API铺 https://api.a20safe.com/ 韩小韩…

小鹏MONA将至:10 - 15万级,用性价比打新势力,用智驾打比亚迪

‍ 作者 |老缅 编辑 |德新 小鹏的全新品牌即将发布,10-15万级也能有高等级智能驾驶。 3月16日在中国电动汽车百人会论坛2024上,小鹏汽车董事长、CEO何小鹏提出:“下一个十年将是智能化的十年。未来18个月内高阶智驾的拐点将到来”。 所谓…

数据机构-2

线性表 概念 顺序表 示例&#xff1a;创建一个存储学生信息的顺序表 表头&#xff08;Tlen总长度&#xff0c; Clen当前长度&#xff09; 函数 #include <seqlist.c> #include <stdio.h> #include <stdlib.h> #include "seqlist.h" #include &…

LeetCode 面试经典150题 274.H指数

题目&#xff1a; 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &#xff0c;一名科研人员的 h 指数 是指他&#xff08;她…

类和对象(2)

封装的概念 访问限定符 Java中主要通过类和访问权限来实现封装&#xff1a;类可以将数据以及封装数据的方法结合在一起&#xff0c;更符合人类对事物的认知&#xff0c;而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符&#xff1a; 在 Java 中…

柔性纤维将织物带入信息时代

一种用半导体器件嵌入纤维的技术可以产生数百米长的无缺陷股线。用这些线编织的服装提供了对未来可穿戴电子产品的诱人一瞥。 想象一下&#xff0c;一顶可水洗的帽子可以帮助盲人感知交通信号灯的变化&#xff0c;或者一件衣服可以在佩戴者穿过博物馆时充当导游。这些技术可以…

Jingle Bio:产品出海的最重要一课是「重营销轻技术」?

名字: Jingle Bio 开发者 / 团队: Luo Baishun 平台: Web 请简要介绍下这款产品 Jingle Bio 是一款不需要任何编程基础就可以轻松驾驭的个人网站制作工具&#xff0c;你可以使用 Jingle Bio 来展示自己的作品、技能、经历、成就、爱好等&#xff0c;构建自己的个人品牌。 哪个瞬…

蓝桥杯第642题——跳蚱蜢

题目描述 如下图所示&#xff1a; 有 9 只盘子&#xff0c;排成 1 个圆圈。 其中 8 只盘子内装着 8 只蚱蜢&#xff0c;有一个是空盘。 我们把这些蚱蜢顺时针编号为 1 ~ 8。 每只蚱蜢都可以跳到相邻的空盘中&#xff0c; 也可以再用点力&#xff0c;越过一个相邻的蚱蜢跳到空盘…

手撕算法-二叉树的镜像

题目描述 操作给定的二叉树&#xff0c;将其变换为源二叉树的镜像。数据范围&#xff1a;二叉树的节点数 0≤_n_≤1000 &#xff0c; 二叉树每个节点的值 0≤_val_≤1000要求&#xff1a; 空间复杂度 O(n) 。本题也有原地操作&#xff0c;即空间复杂度 O(1) 的解法&#xff0c…

双线性插值

1.线性插值 即是提供一次线性已知点去拟合曲线再求得插值点。 2.原理 两次不同方向的插值&#xff0c;先对已知的四个点的值通过两次一次线性插值获取两个点&#xff0c;再通过刚刚获得的两个点的值再进行一次线性插值&#xff0c;从而根据已知的四个点的值获得一个未知的点…

Layui实现删除及修改后停留在当前页

1、功能概述&#xff1f; 我们在使用layui框架的table显示数据的时候&#xff0c;会经常的使用分页技术&#xff0c;这个我们期望能够期望修改数据能停留在当前页&#xff0c;或者删除数据的时候也能够停留在当前页&#xff0c;这样的用户体验会更好一些&#xff0c;但往往事与…

python 基础知识点(蓝桥杯python科目个人复习计划65)

今日复习内容&#xff1a;做题 例题1&#xff1a;遥远的雪国列车 问题描述&#xff1a; 小蓝和小红今天在房间里一起看完了“雪国列车”这部电影&#xff0c;看完之后他们感触颇深&#xff0c;同时他们想到了这样一道题目&#xff1a; 现在有一个数轴&#xff0c;长度为N&a…

thinkphp 微信商户付款到微信小程序用户零钱(v2密钥版)

这几天做项目有一个需求,小程序用户提交记录后,商家后台审核通过自动转账到用户的微信零钱中. 今天分享下如何实现自动打款: 一种是用v2密钥的接口:企业付款到零钱, 一种需要用v3密钥的接口:微信商户转账到零钱 php后端代码 v2企业付款到零钱 /*** 审核通过红包打款* @aut…