WebSocket协议:实现实时双向通信的秘诀

news2024/11/17 10:26:06

目录

🐇今日良言:海压竹枝低复举,风吹山角晦还明

🐇一、WebSocket协议介绍

🐇二、WebSocket如何使用

🐇三、WebSocket和HTTP的区别


🐇今日良言:海压竹枝低复举,风吹山角晦还明

🐇一、WebSocket协议介绍

首先介绍一下什么是WebSocket协议。

WebSocket 协议是一个应用层协议,是一种在单个TCP连接上进行全双工通信的协议。它是一种新的协议,旨在解决HTTP协议无法在Web浏览器和服务器之间实现实时双向通信的问题

接下来介绍一下WebSocket协议报文格式。

在搜索框中输入如下信息:

 找到5.2章节,即可看到WebSocket协议格式:

这里介绍一下相关字段:

FIN :表示是否要关闭websocket。

          注:这里的FIN不是tcp的FIN,只不过是需要通过FIN触发应用层的协议断开连接的

          操作,底层会涉及到tcp的四次挥手。

RSV:保留位。

opcode:操作码。描述了当前这个websocket数据帧是起到什么作用。

MASK:是否开启掩码操作。掩码操作主要是为了避免“缓冲区溢出”。

Payload len:载荷长度。

这里有三种模式:1)7bit,能表示的范围比较小

                             2)16bit的模式,能表示的范围更大。

                             3)64bit的模式,能表示的范围非常大。

如果最初的这个 7 bit 的payload len < 126,此时是模式1

如果 7 bit 的值是 126,此时是模式2,16个bit 生效。

如果 7 bit 的值是 127,此时是模式3,64个bit生效。

payload data:真正要传输的载荷数据。

 websock 握手过程:

🐇二、WebSocket如何使用

在介绍完websocket协议的相关信息之后,来看看如何使用websocket协议吧。

在 Java 中有两种形式来使用 websocket:

1.直接使用tomcat提供的原生 websocket api。

2.使用spring 提供的 websocket api。

这里介绍 第二种使用方式。

基于 Spring 的 websocket api 写一个简单的hello world

需要编写的代码有两部分:1)服务器代码  2)客户端代码

首先编写服务器代码:

第一步,引入相关依赖:

在最初创建项目的时候,需要引入websocket依赖:

 第二步,当依赖引入以后,接下来编写服务器的代码:

1)创建一个类,作为WebSocketHandler(处理 websocket 的各个通信流程)

创建出一个类继承 TextWebSocketHandler(这个类是 Spring内置的,用于传输文本数据)

给这个类加上 @Component 注解,注册到 Spring 中。

这里继承这个类,主要是为了重写这个类中的一些方法。

主要重写的是如下四个方法:

afterConnectionEstablished 这个方法会在websocket连接建立成功以后,被自动调用。

handleTextMessage             这个方法是在websocket收到消息的时候,被自动调用。

handleTransportError           这个方法是在websocket连接出现异常时候,被自动调用

afterConnectionClosed        这个方法是在websocket连接关闭的时候,被自动调用。

这里的 WebSocketSession 是 websocket 连接中的会话

TextMessage  收到的消息是什么

Throwable      对象记录了异常信息

CloseStatus    关闭的状态

修改上述代码,将这个服务器改造成一个回显服务器,直接返回收到的数据:

2)把上述类的实例,给注册到spring 里面,配置路由(关联上哪个路径对应上述handler)

创建一个类,实现 WebSocketConfigurer 接口,重写这个接口里面的方法

服务器端代码编写完成。

实现客户端代码,js 这里的websocket代码编写:

在js这里创建websocket实例的时候,需要传入路由。

这里的ws 是协议名,websocket 的缩写。 

这里的 test 路径需要和前面服务器中的路径对应起来,否则就会404.

接下来,给这个创建的websocket实例注册一些回调函数。

 

 添加点击事件等:

 客户端代码编写完毕,接下来验证一下这个程序。

启动服务器,输入url后,界面显示如下:

 查看控制台打印信息:

 输入信息,并点击发送:

查看Fillder 抓包结果:

 

这里的101 表示协议切换。使用记事本查看请求报文:

 这个请求的发起是 js 这里的代码发起的:

查看响应报文:

 查看服务器打印信息:

以上就是 基于 Spring 的 websocket api 写一个简单的hello world程序的所有流程

🐇三、WebSocket和HTTP的区别

1.HTTP是单向的,客户端发送请求,服务器发送响应。举个例子,当一个用户向服务器发送一个请求这个请求以HTTP或HTTPS的形式出现,在接收到一个请求服务器向客户端发送响应后,每个请求都与相应的响应相关联,在发送响应后,连接被关闭,每个HTTP或HTTPS请求每次都建立到服务器的新连接,在得到响应后,连接自动终止 。

2.WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息 。它以ws://或wss://开头。它是一个有状态协议,这意味着客户端和服务器之间的连接将保持活动状态,直到被任何一方(客户端或服务器)终止。在通过客户端和服务器中的任何一方关闭连接之后,连接将从两端终止。

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

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

相关文章

Spark分布式计算原理

一、Spark WordCount运行原理 二、划分Stage 数据本地化 移动计算&#xff0c;而不是移动数据 保证一个Stage内不会发生数据移动 三、Spark Shuffle过程 在分区之间重新分配数据 父RDD中同一分区中的数据按照算子要求重新进入RDD的不同分区中 中间结果写入磁盘 有子RDD拉取数…

【分享】获取微信通讯录python代码形式实现

具体流程就是&#xff1a; 1. 打开微信 2. 点击通讯录 3. 滚动鼠标到最顶部&#xff08;防止已经滚动了一部分了&#xff09; 4. 获取联系人列表 5. 找到最后一个空格所在的位置&#xff08;后一个就是真正的联系人了&#xff09; 6. 点击第一个联系人 7.记录下上一个联…

Docker-compose创建LNMP服务并运行Wordpress网站平台

一、部署过程 1.安装Docker #关闭防火墙 systemctl stop firewalld.service setenforce 0#安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 #设置阿里云镜像源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/d…

联邦学习中的数据非独立同分布问题

联邦学习中的数据非独立同分布&#xff08;Non-IID&#xff09; 从集中式机器学习到联邦机器学习 集中式模型&#xff1a;传统的集中式机器学习是将所有的数据收集到服务器端&#xff0c;在服务器端统一进行模型训练和处理&#xff0c;并将预测的结果分发给用户。但将数据上传…

树莓派ubuntu上配置miniconda并创建虚拟环境

树莓派安装ubuntu和miniconda配置 本文所配置环境为&#xff1a;树莓派4B安装的系统为ubuntu 22 server&#xff0c;所配置的miniconda版本为4.2&#xff0c;python版本3.8。在此之前要清楚树莓派4B已经将处理器从arm架构换成了aarch64架构&#xff0c;所以能够使用最新的aarc…

基于SpringBoot的音乐网站

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 歌曲分类管理 歌曲信息管理 轮播图管理 歌曲信息 歌曲评论 用户注册 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施…

你必须知道的数据查询途径!!

在当今信息爆炸的时代&#xff0c;我们每天都会面临海量的数据和信息。如何在这些繁杂的信息中快速、准确地找到自己需要的内容&#xff0c;也是当代一个非常重要的技能。下面&#xff0c;我将介绍几种你必须知道的企业数据信息查找途径。 ​ 1. 搜索引擎 搜索引擎是我们日常中…

巴州阳光公益人的国庆

原创 何素平 巴州阳光志愿者服务协会 2023-10-10 15:01 发表于新疆 在中华人民共和国成立74周年之际&#xff0c;巴州阳光公益机构的社工志愿者在党支部的组织下&#xff0c;抒发爱国之情&#xff0c;砥砺强国之志&#xff0c;共同祝愿国家繁荣富强&#xff0c;祝福各族人民幸…

JShaman JavaScript混淆加密工具,中英版本区别

JShaman JavaScript混淆加密工具&#xff0c;中英版本区别如下。 中文版&#xff0c;配置简单&#xff0c;网站功能多&#xff0c;支持代码提交、文件上传、WebAPI&#xff1b; 英文版&#xff0c;配置项较多&#xff0c;网站功能简约&#xff0c;不支持文件上传&#xff0c;…

vue接入高德地图获取经纬度

&#x1f90d;step1:高德地图开放平台&#xff0c;根据指引注册成为高德开放平台开发者&#xff0c;并申请 web 平台&#xff08;JS API&#xff09;的 key 和安全密钥; &#x1f90d;step2:在html引入安全密钥&#xff08;获取经纬度用&#xff0c;不然会报错&#xff09; <…

3款国产办公软件,不仅好用,还支持linux国产操作系统

当提到国产办公软件并支持Linux国产操作系统时&#xff0c;以下是三款备受好评的软件&#xff1a; 1. WPS Office&#xff08;金山办公套件&#xff09; WPS Office是中国知名的办公软件套件&#xff0c;也是一款跨平台的应用程序。它包含文字处理、表格编辑和演示文稿等常见办…

「新房家装经验」客厅电视高度标准尺寸及客厅电视机买多大尺寸合适?

客厅电视悬挂高度标准尺寸是多少&#xff1f; 客厅电视悬挂高度通常在90~120厘米之间&#xff0c;电视挂墙高度也可以根据个人的喜好和实际情况来调整&#xff0c;但通常不宜过高&#xff0c;以坐在沙发上观看时眼睛能够平视到电视中心点或者中心稍微往下一点的位置为适宜。 客…

cesium图标漂移分析与解决

漂移现象如下 什么是图标漂移&#xff1f; 随着视野改变&#xff0c;图标相对于地面发生了相对位置的变化 让人感觉到图标有飘忽不定的感觉 原因分析 图标是静止的&#xff0c;它的位置在世界坐标系中是绝对的、静止的。 漂移大部分的原因是&#xff1a; 透视关系发生了错…

漏电继电器 LLJ-630F φ100 导轨安装 分体式结构 LLJ-630H(S) AC

系列型号&#xff1a; LLJ-10F(S)漏电继电器LLJ-15F(S)漏电继电器LLJ-16F(S)漏电继电器 LLJ-25F(S)漏电继电器LLJ-30F(S)漏电继电器LLJ-32F(S)漏电继电器 LLJ-60F(S)漏电继电器LLJ-63F(S)漏电继电器LLJ-80F(S)漏电继电器 LLJ-100F(S)漏电继电器LLJ-120F(S)漏电继电器LLJ-125F(S…

【工具】SSH端口转发管理器,专门管理SSH Port Forwarding

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 开源代码看这里&#xff1a;http://xfxuezhang.cn/index.php/archives/1151/ 背景介绍 有时候需要用到ssh的端口转发功能。目前来说&#xff0c;要么是cmd里手敲指令&#xff0c;但每次敲也太麻烦了&#xff1b;或…

烟感监控小技巧,这才是最高级的方法!

商业大厦是现代城市中不可或缺的一部分&#xff0c;它们承载着大量的人员和财产。因此&#xff0c;火灾安全一直是商业大厦管理者和业主们极为关注的重要议题。 因此&#xff0c;为了及时发现并迅速应对火灾威胁&#xff0c;商业大厦越来越倾向于采用高效、智能的烟感监控系统。…

springboot-配置文件优先级

官方文档 https://docs.spring.io/spring-boot/docs/2.7.16/reference/htmlsingle/#features.external-config Spring Boot允许外部化配置&#xff0c;这样就可以在不同的环境中使用相同的应用程序代码。您可以使用各种外部配置源&#xff0c;包括Java属性文件、YAML文件、环境…

PTA 7-4 包装机(单调栈)

题目 一种自动包装机的结构如图 1 所示。首先机器中有 N 条轨道&#xff0c;放置了一些物品。轨道下面有一个筐。当某条轨道的按钮被按下时&#xff0c;活塞向左推动&#xff0c;将轨道尽头的一件物品推落筐中。当 0 号按钮被按下时&#xff0c;机械手将抓取筐顶部的一件物品&…

ssti 常见注入模块利用

文件读取 python脚本&#xff08;这里以重庆橙子科技jinjia2模板注入为例&#xff09; import requests url http://39.104.177.130:18080/flaskBasedTests/jinja2/ for i in range(500):data {"name":"{{().__class__.__base__.__subclasses__()["str…

面试经典 150 题 22 —(数组 / 字符串)— 28. 找出字符串中第一个匹配项的下标

28. 找出字符串中第一个匹配项的下标 方法一 class Solution { public:int strStr(string haystack, string needle) {if(haystack.find(needle) string::npos){return -1;}return haystack.find(needle);} };方法二 class Solution { public:int strStr(string haystack, s…