WebSocket 快速入门 与 应用

        WebSocket 是一种在 Web 应用程序中实现实时、双向通信的技术。它允许客户端和服务器之间建立持久性的连接,以便可以在两者之间双向传输数据

以下是 WebSocket 的一些关键特点和工作原理:

0.特点:

  1. 双向通信:WebSocket 允许服务器和客户端之间进行双向通信,无需客户端发起请求。

  2. 实时性:WebSocket 提供了实时性通信的能力,使得服务器可以立即将数据推送给客户端,而无需等待客户端发起请求。

  3. 持久性连接:与传统的 HTTP 请求-响应模式不同,WebSocket 的连接是持久性的,一旦建立连接,它将保持打开状态,直到其中一方主动关闭连接。

  4. 低延迟:由于 WebSocket 使用单一的 TCP 连接,相较于传统的轮询或长轮询方式,它能够减少通信的延迟。

  5. 节省带宽:WebSocket 的头部较小,且在通信过程中不需要重复的 HTTP 头部,因此可以节省带宽。

1.工作原理:

  1. 握手阶段:客户端发起 WebSocket 握手请求,请求头部包含一些特定的字段,如 Upgrade 和 Connection 等。服务器收到请求后,如果支持 WebSocket 协议,会返回 101 状态码,表示协议切换成功,然后连接升级为 WebSocket 连接。

  2. 建立连接:建立连接后,服务器和客户端可以通过发送消息进行通信。每个消息都被分割成一个或多个帧进行传输。

  3. 数据传输:WebSocket 数据以帧的形式传输。帧可以是文本、二进制数据或控制帧。文本帧用于传输文本数据,而二进制帧用于传输二进制数据。控制帧用于控制连接,例如关闭连接或心跳检测。

  4. 保持活动状态:WebSocket 连接可以保持活动状态,无需在每次通信后重新建立连接。服务器和客户端可以周期性地发送心跳消息来保持连接的活跃状态。

  5. 关闭连接:任何一方都可以通过发送关闭帧来关闭连接。关闭帧包含一个状态码和一个可选的关闭消息。收到关闭帧后,双方都应该关闭连接。

        WebSocket 在现代 Web 应用程序中被广泛应用于实时通信、在线游戏、实时协作等场景,它提供了一种高效且可靠的双向通信方式,为开发者提供了更多创新的可能性。

2. 基于 Java 实现 WebSocket

  • 服务端的类
    • 监听连接——@ServerEndpoint
    • 连接成功——@OnOpen
    • 连接关闭——@OnClose
    • 收到消息状态——@OnMessage
(一)方式一:通过注解实现

        实现了一个基于WebSocket的双向通信系统

        其中服务器端配置了 WebSocket 并实现了消息处理和定时推送

        客户端页面则使用 JavaScript 创建WebSocket连接 并实现消息发送和接收。

1.项目依赖

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
2.WsServerEndpoint
/*** 监听webSocket地址  /myWs* 即:监听谁连接了 客户端*//*** 定义了一个 WebSocket 服务器端点的类。它使用了 @ServerEndpoint 来指定 WebSocket 的端点路径为 "/myWs"。** 这个类也使用了 @Component 注解,将这个类标记为 Spring 的组件,以便 Spring 自动扫描并注册它。** 另外,使用了 @EnableScheduling 注解用于开启定时任务功能。*/@ServerEndpoint("/myWs")               //   监听连接
@Component
@Slf4j
@EnableScheduling
public class WsServerEndpoint {static Map<String, Session> sessionMap = new ConcurrentHashMap<>();//连接建立时 进行的操作//@OnOpen: 用于标记连接成功时执行的方法,将建立的 Session 对象存储在 sessionMap 中,并记录日志表示 WebSocket 已连接。@OnOpen             //    连接成功public void onOpen(Session session){sessionMap.put(session.getId(), session);log.info("websocket is open");}// 收到客户端消息时 进行的操作//@OnMessage: 用于标记接收到消息时执行的方法,打印收到的消息并返回一条确认消息。@OnMessage          //    收到消息状态public String OnMessage(String text){log.info("收到了一条消息:"+text);return "已收到你的消息";}// 连接关闭的时候 执行的操作//@OnClose: 用于标记连接关闭时执行的方法,从 sessionMap 中移除对应的 Session 对象,并记录日志表示 WebSocket 已关闭。@OnClosepublic void onClose(Session session){sessionMap.remove(session.getId());log.info("websocket is close");}// 服务端想给 客户端发送数据的话// ===》 定时任务实现     (每隔多少秒执行一次)//@Scheduled: 使用定时任务(通过 @Scheduled 注解)每隔两秒向所有的客户端发送一条消息。@Scheduled(fixedRate = 2000)public void sendMsg() throws IOException {for (String key:sessionMap.keySet()){sessionMap.get(key).getBasicRemote().sendText("心跳");}}
}

3.WebSocketConfig

/*** 定义了一个 Spring @Configuration 类,并且使用了 @Bean 注解向 Spring 容器注册了一个 ServerEndpointExporter 的实例** 这个 ServerEndpointExporter 实例是用于在 Spring Boot 中配置和注册 WebSocket 服务器端点的组件。*/
@Configuration
public class WebSocketConfig {// 将依赖包中的一些  依赖  注入为Bean@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}

4.ws.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>ws client</title>
</head>
<body>
</body>
<!--通过 JavaScript 创建了一个 WebSocket 客户端连接到指定路径 "/myWs"(与服务器端点匹配)。当连接成功建立时,会发送一条消息 "hello,phdvb";同时当接收到消息时,将消息数据打印到控制台。-->
<script>let ws = new WebSocket("ws://localhost:8080/myWs")//当连接打开的时候   想服务端发送消息ws.onopen = function() {ws.send("hello,phdvb")}ws.onmessage = function(message) {console.log(message.data)}
</script>
</html>

实现效果

(二)方式二:通过Spring类+接口实现

3.基于websocket实现多人聊天室

  • 实现的功能
    • 进入聊天室
    • 群聊功能,任何人说话,所有人都能接收到提醒
    • 退出群聊

4.websocket的应用场景


解决怎样的经典问题?

Q: 由于Http协议,只能由浏览器向服务器发送请求,服务器无法直接向浏览器发送请求

        常见的提点方案:浏览器以轮询的方式向服务器发送请求

        轮询的缺陷:浪费带宽,实时性差,导致服务器压力较大


PC端二维码支付:

https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay
/chapter2_7_2.shtml

       

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

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

相关文章

Mocha + Chai 测试环境配置,支持 ES6 语法

下面是一个完整的 Mocha Chai 测试环境配置&#xff0c;支持 ES6 语法。我们将使用 Babel 来转译 ES6 代码。 步骤一&#xff1a;初始化项目 首先&#xff0c;在项目目录中运行以下命令来初始化一个新的 Node.js 项目&#xff1a; npm init -y步骤二&#xff1a;安装必要的…

[AI Stability] 开源AI新利器:Stable Diffusion 3 Medium震撼发布!文本到图像再升级!

Stable Diffusion 3 Medium(SD3) 开源了&#xff0c;我们来看下。 关键要点 Stable Diffusion 3 Medium 是 Stability AI 迄今为止最先进的文本到图像开源模型。该模型的体积小巧&#xff0c;非常适合在消费级 PC 和笔记本电脑上运行&#xff0c;也适合在企业级 GPU 上运行。…

### RabbitMQ五种工作模式:

RabbitMQ五种工作模式&#xff1a; 1、简单模式&#xff1a;就是不通过交换机&#xff0c;消息直接通过队列&#xff0c;一对一收发。 2、工作队列模式&#xff1a;也是不通过交换机&#xff0c;消息直接通过队列&#xff0c;只是一个发送方可以有多个接收端。 3、发布订阅模…

2024年科技趋势与未来展望

引言 2024年已经到来&#xff0c;科技领域正在以前所未有的速度发展。从人工智能到量子计算&#xff0c;再到绿色科技&#xff0c;每一个领域都在经历着巨大的变革。这篇文章将探讨2024年最值得关注的科技趋势&#xff0c;并对未来的科技发展进行展望。 1. 人工智能与机器学习…

产品经理简要介绍主流电商平台商品API接口的重要应用价值

主流电商平台&#xff1a; 截至目前&#xff08;2024年6月&#xff09;&#xff0c;主流电商平台通常指的是国内外知名的在线购物平台&#xff0c;包括但不限于以下几家&#xff1a; 1. 中国电商平台&#xff1a; - 淘宝网&#xff08;taobao.com&#xff09; - 天猫商…

端午消费数据:“下沉”“价跌”延续

端午假期消费延续了五一的“下沉”与“价跌”趋势。一是人均旅游支出的恢复程度&#xff0c;仍不及2019年&#xff08;恢复至89.5%&#xff09;&#xff1b;二是三线以下城市继续成为旅游新增长点&#xff0c;其平台订单热度高于部分一线和新一线城市。三是国内、国际机票酒店价…

宝塔面板怎么搭建网站论坛

宝塔面板怎么搭建网站论坛?在数字化时代&#xff0c;网站已经成为企业展示形象、推广产品、服务客户的重要窗口。然而&#xff0c;对于许多初次接触建站的朋友来说&#xff0c;如何快速、便捷地搭建一个功能齐全、稳定可靠的网站&#xff0c;却是一个不小的挑战。今天&#xf…

自动同步库数据——kettle开发36

kettle中的那些人工智能。 一、kettle的AI能力目录 跨库同步 2.自动开发 3.自动优化 二、AI实例 1、跨库同步 sqlsever表同步至oracle数据库 1.1源库sqlserver 1.2目标库oracle 1.3可视化跨库同步 使用多表复制向导 选择跨库的表&#xff0c;下一步下一步&#xff0c;即可…

【JavaScript脚本宇宙】交互无限可能:探索JavaScript库的交互性魔力

手到擒来&#xff1a;JavaScript库助力网页交互功能提升 前言 在Web开发中&#xff0c;使用合适的JavaScript库可以大大简化实现各种交互功能的复杂性。本文将介绍一些常用的JavaScript库&#xff0c;包括用于拖动、调整大小、多点触控手势、创建可拖动和可调整大小的网格布局…

餐厅吃饭优惠笔记

1 闲鱼&#xff1a;电子优惠券 亚马逊自助餐厅&#xff08;亚马逊环球美食百汇&#xff09;

Javaweb避坑指北(持续更新)

内容较多可按CtrlF搜索 0.目录 1.获取插入数据后自增长主键的值 2.Controller中返回给ajax请求字符串/json会跳转到xxx.jsp 3.ajax请求获得的json无法解析 4.在Controller中使用ServletFileUpload获取的上传文件为null 5.莫名其妙报service和dao里方法的错误 6.ajax请求拿…

windows执行定时任务

schtasks 是 Windows 系统中的一个命令行工具&#xff0c;用于创建和管理任务计划。以下是一些使用 schtasks 创建和管理定时任务的基本命令&#xff1a;创建定时任务&#xff1a;schtasks /create /tn "TaskName" /tr "TaskRun" /sc ScheduleType [其他选…

Python初学笔记

文章目录 关于input()input().split() output()output()类型敏感&#xff01;print()行为指定 Python中的数学运算除法 python中的变量变量的数据类型type()和isinstance()Stringbool切片操作ListTupleSetDictionaryBytes类型 正则表达式推导式字典推导式推导式的执行顺序 迭代…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] CPU算力分配(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 CPU算力分配(100分) 🌍 评测功能需要订阅专栏后私信联系清…

python对数字和点分割的版本号,进行排序

versions [100.0.4896.20, 1.2.3, 10.0.3, 2.0, 0.9.8] sorted_versions sorted(versions, keylambda x: list(map(int, x.split(.)))) print(sorted_versions) # [0.9.8, 1.2.3, 2.0, 10.0.3, 100.0.4896.20]

DeepSpeed Monitoring Comm. Logging

Monitoring 支持多种后端&#xff1a;Tensorboard、WandB、Comet、CSV文件&#xff1b; TensorBoard例子&#xff1a; 自动监控&#xff1a;DeepSpeed自动把重要metric记录下来。只需在配置文件里enable相应的看板后端即可&#xff1a; {"tensorboard": {"enabl…

Linux-笔记 全志平台OTG虚拟 串口、网口、U盘笔记

前言&#xff1a; 此文章方法适用于全志通用平台&#xff0c;并且三种虚拟功能同一时间只能使用一个&#xff0c;原因是此3种功能都是内核USB Gadget precomposed configurations的其中一个选项&#xff0c;只能单选&#xff0c;不能多选&#xff0c;而且不能通过修改配置文件去…

湖北省七普分乡、镇、街道数据,shp、excel格式 需要自取

数据名称: 湖北省七普分乡、镇、街道数据 数据格式: Shp、excel 数据几何类型: 面 数据坐标系: WGS84 数据时间&#xff1a;2020年 数据来源&#xff1a;网络公开数据 数据可视化.

Vue27-内置指令04:v-once指令

一、需求 二、v-once指令 获取初始值&#xff1a; 三、小结

Spring Cloud Nacos 详解:服务注册与发现及配置管理平台

Spring Cloud Nacos 详解&#xff1a;服务注册与发现及配置管理平台 Spring Cloud Nacos 是 Spring Cloud 生态系统中的一个子项目&#xff0c;提供了服务注册与发现、配置管理等功能&#xff0c;基于 Alibaba 开源的 Nacos 项目。Nacos 是一个易于使用的动态服务发现、配置管…