WebSocket的核心事件

2023-11-10

前言

在上一篇文章中:Spring Boot使用WebSocket模拟聊天 已经简单实现了我们WebSocketDemo,里面使用的WebSocket事件函数在此做一个总结。

WebSocket整体通讯的流程就是 建立链接->发送消息->关闭链接/终止链接,这几步需要的事件Api主要就是以下几个

建立连接

当在客户端和服务器建立连接时,就会从`WebSocket`实例触发open事件。可以认为onopen是客户端和服务器之间的初始握手。

客户端代码

客户端通过new WebSocket指定WebSocket ServerEndpoint地址就可以与服务器建立连接

new WebSocket("ws://127.0.0.1:8080/api/websocket");

服务端代码

服务端则需要@OnOpen注解标明建立连接时触发的方法和业务逻辑

@OnOpen
public void onOpen(Session session){
    log.info("客户端建立连接,Id为:{}",session.getId());
}

客户端回调

在连接建立成功后需要通知客户端连接已经建立成功,这一步操作WebSocket提供了onopen事件来进行客户端连接成功的回调操作,代码如下:

websocket.onopen = function() {
    console.log("WebSocket连接成功");
}

发送接收消息

WebSocket是双工通信,允许服务端主动发送消息到客户端,所以发送接收消息是双向的,他们的接受和发送消息的方式却各有不同

客户端发送消息

建立连接后客户端主动发送消息到服务端是通过send事件,客户端可以发送的信息包括纯文本消息,二进制数据或图像。

websocket.send(message);

服务端接受消息

在建立连接后无论客户端何时发送消息服务端都会触发OnMessage事件来接收消息数据,在Java中是通过
@OnMessage注解标明触发的方法的。

@OnMessage
public void onMessage(String message,Session session){
    log.info("客户端:{},接受到消息:{}",session.getId(),message);
}

服务端发送消息

既然是双工通信服务端自然也可以给客户端发生消息,但发送消息是个主动的操作,并且还要知道发生给那个客户端,所以服务端发送消息不是用的注解方式,是通过WebSocketSession类的两个方法

  • getAsyncRemote
  • getBasicRemote

两种的区别就是同步跟异步的消息发送方式,可以根据具体情况选择使用,发送的消息类型则有五种

  • sendText(): 此方法发送的消息是String类型,支持部分消息发送,通过boolean值操控
  • sendBinary():此方法发送的消息是ByteBuffer类型,支持部分消息发送,通过boolean值操控
  • sendObject():此方法发送的消息类型是Object类型
  • sendPing():此方法发送的消息是ByteBuffer类型ping是请求消息 没有特定类 byte buffer
  • sendPong():此方法发送的消息是ByteBuffer类型pong是响应消息 它也可以用作单向心跳消息

注意:

  • sendPing和sendPong的字节数据不能大于125bytes。只能用来检测状态,不应用与业务数据传输。
  • Ping消息只能发送(不能接收)而Pong可以发送和接收
  • Ping的消息不需要写逻辑来明确地返回去响应一个ping - Java WebSocket API的实现会为你自动的处理

在业务上发送消息最常用的还是sendTextsendBinary,代码如下:

public void send(Session session, String msg) throws IOException {
    session.getBasicRemote().sendText(msg);
}

客户端接受消息

客户端接受消息也是onMessage事件,通过websocket.onmessage,代码如下:

websocket.onmessage = function (event){
    alert(event);
}

查看服务端推送的消息内容,data就是返回的消息体

在这里插入图片描述


关闭链接

关闭连接的操作服务端客户端都可以操作,客户端可以通过用户退出窗口/系统或者主动调用close事件等方式来关闭连接。

客户端关闭连接

当客户端建立WebSocket连接后退出客户端页面则会自动触发服务端的OnClose事件,效果如下图

在这里插入图片描述

也可以通过websocket.close()事件进行主动退出。

服务端监听关闭连接

在关闭连接后通常会有些后续业务需要处理,所以服务端要通过监听连接关闭事件来进行相应业务的后续处理,这个监听事件的实现就是@OnClose注解,代码如下:

@OnClose
public void onClose(Session session){
    log.info("客户端断开连接,Id为:{}",session.getId());
}

客户端监听关闭连接

跟服务端的一样,客户端监听关闭连接也是通过onclose事件,服务端关闭也会触发客户端的onclose事件,代码如下

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

注意:如果是客户端主动触发close事件关闭连接会进行onclose事件的触发,直接关闭窗口则不会触发onclose的事件,如果想要窗口关闭也执行onclose事件的后续处理就加上监听窗口关闭事件的函数,代码如下:

window.onbeforeunload = function() {
    alert("WebSocket连接关闭");
}

连接异常

连接异常在WebSocket中是onerror事件,用来处理连接出现异常的情况下的业务通知

客户端代码

客户端通过websocket.onerror事件来监听连接出现异常的通知,代码如下:

websocket.onerror = function (event){
    console.log(event)
}

注意:不是所以的异常都有event,所以在onerror的事件下要校验event的内容

服务端代码

服务端通过@OnError注解监听连接异常时通知,并且必须带有Throwable类,代码如下:

@OnError
public void onError(Session session, Throwable error){
    log.info("客户端发生异常,Id为:{}",session.getId());
}

总结

不管客户端还是服务端WebSocket的核心事件分为两类,一类是监听事件、一类是触发事件

监听事件

监听事件主要就是以下四类,在服务端跟客户端都通用

  • onOpen:监听连接建立的消息
  • onMessage:监听双端发送的消息
  • onClose:监听连接断开的消息
  • onError:监听异常发生的消息

触发事件

触发事件主要就是发送消息断开连接需要触发,也是客户端跟服务端都通用

  • send:主动发送消息的事件
  • close:主动关闭连接的事件
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebSocket的核心事件 的相关文章

随机推荐

  • Unity Physics.OverlapSphere实现冲击波

    知识点1 球形射线检测 根据 层级Layer 和 半径值球形范围 内 过滤获得 Collider数组 用途 冲击波 对范围内游戏对象造成伤害 Physics OverlapSphere gameObject transform positi
  • 熔断,降级,限流区别

    熔断 限流 降级都是保持系统稳定运行的策略 但针对的场景有所不同 熔断 服务熔断的作用类似于我们家用的保险丝 当某服务出现不可用或响应超时的情况时 为了防止整个系统出现雪崩 暂时停止对该服务的调用 上面的解释中有两个很关键的词 一个是暂时
  • 推荐几个好用又好玩的vscode插件!

    推荐几个有用的插件 会提高你的开发效率 走过路过不要错过 一 koroFileHeader 先来一个镇场子的 一键生成佛祖保佑 下载koroFileHeader插件 安装之后 新建一个文件 这时候会自动生成一个模板 显示作者的相关信息 当然
  • 如何用原生JS写一个简单购物车?来这篇文章告诉你。

    首先声明这仅仅只是个人理解而已 有什么错误或者缺少大家尽管在评论区发出来 共同学习 一起进步 首先呢 我们要创建一个HTML基础代码 基础HTML代码模板如下 他是比较关键的 是我们接下来了解的属性相关 可以直接复制拿来用的哈 它的意义就是
  • Redis进阶实践之十一 Redis的Cluster集群搭建

    https www cnblogs com PatrickLiu p 8458788 html 一 引言 本文档只对Redis的Cluster集群做简单的介绍 并没有对分布式系统的所涉及到的概念做深入的探讨 本文只是针对如何设置集群 测试和
  • 人物关系图谱:ECharts 实现

    目录 1 什么是ECharts 2 开始简单配置关系图 3 完整代码 1 什么是ECharts ECharts是百度开源的纯 Javascript 图表库 目前开源可以与highcharts相匹敌的一个图表库 相信有很多国内用户使用 官网
  • 一、PID控制原理

    在模拟控制系统中 控制器最常用的控制规律是PID控制 模拟PID控制系统原理框图如下图 系统由模拟PID控制器和被控对象组成 PID控制器是一种线性控制器 它根据给定值Yd t 与实际输出值Y t 构成控制偏差 err Yd Y PID的控
  • 接口继承接口,类实现接口

    接口继承接口 1 类与类之间是单继承的 直接父类只有一个 2 类与接口之间是多实现的 一个类可以有多个接口 3 接口与接口之间是多继承的 注意事项 1 多个父接口当中的抽象方法如果重复没有关系 抽象的没事 没有方法体 2 多个父接口当中的默
  • windows为配置安全策略

    文章目录 限制 Management Manage01 05 只能从Client登录 限制 Finance F01 10 不能关闭计算机和重启计算机 所有的域计算机和域用户都能自动注册证书 证书颁发机构已经颁发过一次就不再重复颁发 除非证书
  • ChatGPT国内镜像软件推荐

    1 ChatGPT镜像是什么 ChatGPT镜像是一种技术方案 它将OpenAI的ChatGPT模型与相关技术部署在用户本地或私有服务器上 采用这种方式 用户可以在自己的环境中运行ChatGPT模型 无需依赖于OpenAI的在线API服务
  • 考研复试数据库原理课后习题(十四)——内存数据库系统

    内存数据库系统 1 内存数据库和磁盘数据库有什么区别 2 内存数据库的特点有哪些 内存是计算机存储体系结构中能够被程序可控访问 相对于硬件控制的cache 的最高层次 是能够提供大量数据存储的最快的存储层 内存数据库具有几个重要特性 高吞吐
  • 【RT-DETR】《DETRs Beat YOLOs on Real-time Object Detection》译读笔记

    DETRs Beat YOLOs on Real time Object Detection 摘要 近期 基于端到端的 transformer based的检测器 DETRs 取得了卓越的性能 然而 DETRs类模型计算成本高的问题尚未得到
  • 前沿应用丨大规模无人机集群与“虚实结合”半实物仿真系统

    一 应用背景 无人机集群在军事 安全 救援 航空监测 物流配送等领域具有广泛的应用前景 它可以提高任务执行的效率 灵活性和安全性 同时降低人力资源的需求和风险 无人机集群研究涉及多个学科领域 如机器人学 控制理论 通信技术和人工智能等 目前
  • TCP/IP 网络设备与基础概念

    本文目的在于按照自己的理解 解释清楚网络中的一些基本概念 以及支撑概念落地的网络设备的工作原理 从而解决网络联通性问题 以及为定量分析网络性能问题打基础 如有错漏 欢迎指正 什么是 WAN vs LAN 什么是子网 网关 LAN vs 子网
  • 小白笔记——HTML到Java的Date型转换

    本笔记旨在记录新手学习编程时遇到的问题以及解决方法 主要是作为备忘录来使用 希望路过的大神可以指点一二 同时也希望这个笔记可以帮助到其他有同样困惑的小伙伴 大学毕业之后就再没有用中文写过文章了 所以我写的东西字里行间都会透露出一股子翻译大碴
  • 星星之火-58:CPRI协议缺点,eCPRI协议是如何克服CPRI协议的不足?

    1 CPRI协议不足 CPRI数据传输链路属于空口协议栈 硬件 应用软件共同实现空口协议栈 RFIC gt FPGA RF gt 时域采样 CPRI gt CPRI gt DSP gt L1 软件 gt L2软件 gt L3软件 1 CPR
  • Orcale产生随机数

    1 Oracle中产生uuid的方法 select lower sys guid from dual 2 oracle中函数nvl 如果oracle第一个参数为空那么显示第二个参数的值 如果第一个参数的值不为空 则显示第一个参数本来的值
  • [orin] nvidia orin 上配置tensorrt

    版本 jetpack 5 0 1 tensorrt 8 4 1 5 概述 tensorrt会跟着jetpack的包一起安装 系统本身自带的python是3 8的版本 tensorrt的python包位于这个路径下 cd usr lib py
  • 可视化dockerregistry中的镜像

    1 先来个简单的 docker run d p 5000 5000 name registry srv registry 2 docker run it p 8080 8080 name registry web link registry
  • WebSocket的核心事件

    前言 在上一篇文章中 Spring Boot使用WebSocket模拟聊天 已经简单实现了我们WebSocket的Demo 里面使用的WebSocket事件函数在此做一个总结 WebSocket整体通讯的流程就是 建立链接 gt 发送消息