SpringBoot3集成WebSocket

标签:WebSocket,Session,Postman。

一、简介

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

基于Postman工具的WebSocket交互

Connected to ws://127.0.0.1:8088/web/socket/msgHandshake Details
Request URL: http://127.0.0.1:8088/web/socket/msg
Request Method: GET
Status Code: 101 Request Headers
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: 5Qrs8JeRLsiY9G/PRJUocQ==
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Host: 127.0.0.1:8088Response Headers
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Accept: E3aFw2bBzxByPCynmQ7lZ+7BgsU=
Sec-WebSocket-Extensions: permessage-deflate;client_max_window_bits=15

二、工程搭建

1、工程结构

2、依赖管理

starter-websocket的依赖中,涉及到spring框架中两个关系较为密切的组件,分别是websocketmessaging组件。

<!--WebSocket-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>${spring-boot.version}</version>
</dependency>

三、WebSocket用法

1、示意图

在下面的案例中,大致模拟这样一个流程,三个客户端分别和服务端建立连接,然后进行客户端之间的会话通信。

2、API参考

这里通过4个核心的方法注解,分别处理会话的不同动作,比如连接的建立和关闭,通信交互和错误处理;在实际的应用场景中,需要在通信方法中设计更多的指令来应对不同的业务场景。

@ServerEndpoint("/web/socket/msg")
public class MsgWebSocket {private static final  ConcurrentHashMap<String,Session> sessions = new ConcurrentHashMap<>();private static final AtomicInteger onlineCount = new AtomicInteger(0);/*** 建立连接调用的方法*/@OnOpenpublic void onOpen(Session session) {String userId = session.getRequestParameterMap().get("userId").get(0);// 加入Set中sessions.put(userId,session);// 在线数增加onlineCount.getAndIncrement();log.info("session-{},online-count-{}",session.getId(),onlineCount.get());}/*** 客户端消息处理的方法*/@OnMessagepublic void sendMsg(Session sender,String message) throws Exception {MsgDTO dto = JSONUtil.toBean(message, MsgDTO.class);Session receiver = sessions.get(dto.getUserId());if (receiver != null) {receiver.getBasicRemote().sendText(dto.getMsg());}}/*** 关闭连接调用的方法*/@OnClosepublic void onClose(Session session) {String userId = session.getRequestParameterMap().get("userId").get(0);// 从Set中删除sessions.remove(userId);// 在线数减少onlineCount.getAndDecrement();log.info("session-{},down-line-count-{}",session.getId(),onlineCount.get());}/*** 发生错误调用的方法*/@OnErrorpublic void onError(Session session, Throwable throwable) throws Exception {log.error("Web Stock Error", throwable);session.getBasicRemote().sendText(throwable.getMessage());}
}

测试效果图:注意这里使用的是postman最新版本。

四、源码参考

文档仓库:
https://gitee.com/cicadasmile/butte-java-note源码仓库:
https://gitee.com/cicadasmile/butte-spring-parent

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

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

相关文章

003_PyCharm的安装与使用

如果你正在学习PyQt&#xff0c;本系列教程完全可以带你入门直至入土。 所谓从零开始&#xff0c;就是从软件安装、环境配置开始。 不跳过一个细节&#xff0c;不漏掉一行代码&#xff0c;不省略一个例图。 IDE 开始学习一个编程语言&#xff0c;我们肯定是首先得安装好它&…

std::funture和std::promise

#include <iostream> #include <thread> #include <future>void calculateResult(std::promise<int>& promiseObj) {// 模拟耗时计算std::this_thread::sleep_for(std::chrono::seconds(2));// 设置结果到 promise 中promiseObj.set_value(42); }i…

信息系统项目管理师——十大管理过程输入、工具和技术、输出(论文篇)二

六、项目风险管理 规划风险管理 在撰写关于“规划风险管理”的论文时&#xff0c;这个过程是项目风险管理的第一步&#xff0c;旨在建立风险管理的框架&#xff0c;为整个项目周期内的风险识别、分析、应对和监控奠定基础。以下是规划风险管理过程中可能涉及的输入、工具和技…

Python学习(五)异常处理

异常概念 异常的捕获方法 try: f open("D:/abc.txt","r",encoding"UTF-8") except: print("出现异常了&#xff0c;因为文件不存在&#xff0c;我将open的模式&#xff0c;改为w模式去打开") f open("D:/abc.txt&qu…

Python代码:十、字符串连接

1、题目 小明有两个最好的朋友&#xff0c;他们的名字分别用input读入记录在两个字符串中&#xff0c;请使用字符串连接&#xff08;&#xff09;帮助牛牛将两个朋友的名字依次连接在一个字符串中输出。 2、代码 import sysstr1 input() str2 input() str3 str1 str2 pr…

从0到1:使用HuggingFace的管线加载Diffusion模型生成第一张图像!

Hugging Face系列1&#xff1a;详细剖析Hugging Face网站资源 前言本篇摘要1. Hugging Face Hub三大件1.1 模型1.1.1 模型简介1.1.2 制作模型卡片1.1.3 模型下载和上传1.1.4 模型应用 1.2 数据集1.2.1 数据集简介1.2.2 调用代码1.2.3 AutoTrain在线微调 1.3 Space应用1.3.1 内容…

理解 Python 中的 `super()` 与 `__init__()` 方法

在 Python 的面向对象编程中&#xff0c;super() 函数和 __init__() 方法是两个非常重要的概念。它们在类的继承和初始化过程中扮演着关键的角色。本文将深入探讨这两个概念的工作原理&#xff0c;并通过示例代码来展示它们的使用。 基本原理 __init__() 方法 __init__() 是…

Vue中的全局事件总线:EventBus与$bus的比较详解与实战应用

EventBus实例&#xff1a; var EventBus new Vue() 会创建一个名为EventBus的Vue实例&#xff0c;并将其存储在变量EventBus中。Vue.prototype.$bus new Vue() 则直接在Vue的原型上创建一个新的Vue实例&#xff0c;并将其赋值给$bus属性。 使用方式&#xff1a; var EventBus…

C# 结合 JavaScript 对 Web 控件进行数据输入验证

目录 关于数据验证 范例运行环境 验证设计 JavaScript 方法 设计 实现 调用示例 C# 方法 设计 实现 调用示例 小结 关于数据验证 在 Web 应用的录入界面&#xff0c;数据验证是一项重要的实现功能&#xff0c;数据验证是指确认 Web 控件输入或选择的数据&#xff…

类对象作为类成员

在C中&#xff0c;类对象可以作为另一个类的成员变量。这种设计方式可以用于创建复杂的对象结构&#xff0c;使得一个类的对象能够包含另一个类的对象。这种嵌套类的组合方式可以增强代码的可重用性和模块化。 类对象作为类成员的示例 让我们通过一个示例来解释这一概念。假设…

武汉信息系统建设和服务能力评估CS认证咨询

很多企业在咨询信息系统建设和服务能力评估的时候喜欢百度搜索&#xff0c;不管是本地咨询机构还是外地咨询机构只要价格便宜就找谁&#xff0c;这个在低等级的CS1是可以这么操作的&#xff0c;一旦上升到CS2级别及以上的&#xff0c;我们一般不推荐找外地咨询机构&#xff0c;…

【文末附gpt升级方案】字节跳动发布豆包大模型:AI领域的革新与引领

随着科技的飞速进步&#xff0c;人工智能&#xff08;AI&#xff09;已逐渐成为推动社会发展的重要力量。在这一背景下&#xff0c;字节跳动公司以其前瞻性的眼光和创新能力&#xff0c;于XXXX年XX月XX日正式发布了豆包大模型&#xff0c;这一举动无疑在AI领域掀起了新一轮的浪…

C语言.动态内存管理

动态内存管理 1.为什么要有动态内存分配2.malloc和free2.1malloc2.2free 3.calloc和realloc3.1calloc3.2realloc 4.常见的动态内存管理的错误4.1对NULL指针解引用操作4.2对动态开辟空间的越界访问4.3对非动态开辟内存使用free释放4.4使用free释放一块动态开辟内存的一部分4.5对…

军训中的美差

大学时候的军训是在二年级秋季开学前进行的&#xff0c;地点是在河北的某部队。 军训时候的分班是按照学号重新划分的&#xff0c;我的学号在大学宿舍八个人中排最后&#xff0c;恰好就和其他宿舍的人分在了一个班。训练正步走的时候&#xff0c;站在我左边的那个哥们&#xf…

Signal 即将成为JavaScript的一部分

什么是响应性&#xff1f; 在过去的几年中&#xff0c;响应性成为了所有现代前端框架以及React库的核心。 对于不熟悉前端开发的人来说&#xff0c;起初这可能是一个令人困惑的概念&#xff0c;因为它改变了常规的、自上而下的、从调用者到被调用者的顺序工作流。 在响应性范…

AR系列路由器配置VLAN间通信

AR路由器是华为公司推出的企业级路由器产品系列&#xff0c;具有高可靠性、高性能和易管理等特点。AR 系列路由器提供的功能包括路由转发、安全接入、语音、视频、无线等多种业务&#xff0c;支持各种接入方式和协议&#xff0c;并且可以方便地进行扩展和升级。 实验拓扑图&…

微信小程序介绍

一、微信小程序概述 微信小程序是一种不需要下载、安装即可使用的应用&#xff0c;用户只需扫一扫或搜一下即可打开。它实现了应用触手可及的梦想&#xff0c;降低了应用的使用门槛。微信小程序自2017年1月上线以来&#xff0c;已经吸引了大量开发者加入&#xff0c;构建了一个…

【全开源】云界旅游微信小程序(源码搭建/上线/运营/售后/维护更新)

开启您的云端旅行新体验 一、引言 在快节奏的现代生活中&#xff0c;旅行成为了人们放松身心、探索世界的重要方式。让您的旅行更加便捷、高效&#xff0c;打造了云界旅游小程序&#xff0c;带您领略云端旅行的无限魅力。 二、小程序功能概览 云界旅游小程序集成了丰富的旅游…

【代码随想录算法训练营第37期 第九天 | LeetCode28. 实现 strStr()、459.重复的子字符串】

代码随想录算法训练营第37期 第九天 | LeetCode28. 实现 strStr()、459.重复的子字符串 一、28. 实现 strStr() 解题代码C&#xff1a; class Solution { public:void getNext(int* next, const string& s) {int j 0;next[0] 0;for(int i 1; i < s.size(); i) {whi…

【Maven】Nexus私服简介_下载安装_登录

1、简介 1.1介绍 Nexus私服&#xff0c;也被称为Maven仓库管理器&#xff0c;是许多公司在自己的局域网内搭建的远程仓库服务器。提供了强大的仓库管理功能和构件搜索功能&#xff0c;使得开发人员能够更方便地管理和使用Maven项目中的依赖库。 1.2作用 内网访问&#xff1…