Websocket在Java中的实践——自动注册端点

在《Websocket在Java中的实践——握手拦截器》中我们使用握手拦截器实现了路径解析的工作。这个过程略显复杂,因为路径解析这样比较底层的工作应该由框架来解决,而不应该交由开发者来做。本文介绍的自动注册端点的功能就可以很优雅的解决这个问题。

依赖

在pom.xml中新增

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

自动注册端点

当Spring容器启动时,serverEndpointExporter会扫描所有带有@ServerEndpoint注解的类,并将这些类注册为WebSocket端点,这样客户端就可以通过相应的URL与这些端点建立WebSocket连接。

package com.nyctlc.endpointexporter.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}}

端点

@ServerEndpoint是一个注解,用于声明一个类为WebSocket服务器端点。在Java中,特别是在使用Jakarta WebSocket API(之前称为Java API for WebSocket)时,这个注解非常关键。通过使用@ServerEndpoint注解,可以将一个普通的类转变为WebSocket服务器端点,从而能够处理WebSocket连接、消息和其他事件。

package com.nyctlc.endpointexporter.handler;import java.util.concurrent.ConcurrentHashMap;import org.springframework.stereotype.Component;import jakarta.websocket.OnClose;
import jakarta.websocket.OnError;
import jakarta.websocket.OnMessage;
import jakarta.websocket.OnOpen;
import jakarta.websocket.Session;
import jakarta.websocket.server.PathParam;
import jakarta.websocket.server.ServerEndpoint;@Component
@ServerEndpoint("/websocket/{userId}")
public class WebSocketHandler {private static final ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();// WebSocket handler implementation@OnOpenpublic void onOpen(Session session, @PathParam(value = "userId") String userId){sessionPools.put(userId, session);// WebSocket onOpen implementation}@OnClosepublic void onClose(Session session, @PathParam(value = "userId") String userId){// WebSocket onClose implementation}// Other WebSocket methods@OnMessagepublic void onMessage(Session session, String message, @PathParam(value = "userId") String userId){// WebSocket onMessage implementationfor (Session s : sessionPools.values()) {if (s.equals(session)) {continue;}s.getAsyncRemote().sendText(userId+" said: " + message);}}@OnErrorpublic void onError(Session session, Throwable throwable, @PathParam(value = "userId") String userId){// WebSocket onError implementation}
}

测试

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

[C++][设计模式][原型模式]详细讲解

1.动机 在软件系统中&#xff0c;经常面临这“某些结构复杂的对象”的创建工作&#xff1b;由于需求的变化&#xff0c;这些对象经常面临着剧烈的变化&#xff0c;但是它们却拥有比较稳定一致的接口如何应对这种变化&#xff1f;如何向“客户程序(使用这些对象的程序)”隔离出…

STM32HAL库--IIC实验(速记版)

STM32 的普通 IO 口模拟 IIC 时序&#xff0c;可实现与 EEPROM 外设双向通信。 IIC 简介 IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线&#xff0c;用于连接微控制器以及其外围设备。 IIC 是由数据线 SDA 和时钟线 SCL 构成的串行总线。 IIC …

在数据库领域是如何实现“多租户”的呢?

数据库多租技术介绍 随着云计算时代的到来&#xff0c;多租户的概念也逐渐广为人知。“多租户”使得租户之间可以共享物理资源&#xff0c;能够帮助用户节约硬件成本和运维成本&#xff0c;提高资源利用效率。同时&#xff0c;在实现的过程中&#xff0c;考虑到共享带来的安全…

three.js - matcap材质(MeshMatcapMaterial)

说一下matcap纹理 先总结&#xff1a;MeshMatcapMaterial材质&#xff0c;通过采样含有光照信息的贴图来模拟光照效果。这种材质特别适用于模拟静态光源下的光照&#xff0c;并且&#xff0c;因其简单性和快速性而被广泛应用于各种场景。但是&#xff0c;由于其性能考虑&#x…

系统思考—啤酒游戏经营决策沙盘

在日常的教学中&#xff0c;我们通过系统思考仿真演练深入探索决策背后的动因。例如&#xff0c;我经常教授的麻省理工学院研发的“啤酒游戏”和“人民航空策略模拟”&#xff0c;这些都是麻省理工MBA学生的必修课。此外&#xff0c;还有更简洁的“红黑游戏”“收获季节”等模拟…

ElasticSearch索引架构与存储

关于ES官网的介绍: Elasticsearch provides near real-time search and analytics for all types of data. Whether you have structured or unstructured text, numerical data, or geospatial data, Elasticsearch can efficiently store and index it in a way that support…

在低版本Excel中创建次级下拉列表

在低版本中indirect函数不支持选区&#xff0c;创建次级下拉列表得依靠“名称管理”给选区命名。 (笔记模板由python脚本于2024年06月26日 06:24:22创建&#xff0c;本篇笔记适合常用Excel处理数据的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www…

mid360配置lio-sam、point-lio和faster-lio(faster-lio未敢配置)

一、使用mid360配置lio-sam 1.首先从GitHub - nkymzsy/LIO-SAM-MID360 at Livox-ros-driver2 下载能支持mid360的lio-sam版本到 ws_livox/src中&#xff0c;直接编译&#xff0c;就可以成功。 2.使用 roslaunch lio_sam run6axis.launch以及播之前我才记得Mid360的包&#x…

Redis 缓存一致性

Redis 业务结构 流程图 缓存一致性 Redis 和 MySQL 中数据保持一致 双检加锁策略 主要用于解决多线程环境下的并发问题&#xff0c;确保在高并发场景下对共享资源的访问是互斥的&#xff0c;避免因竞争条件导致的不一致状态 public User findUserById(Integer id) {User user …

idea中maven新增的配置文件xx.xml没生效问题

项目场景&#xff1a; 因为公司使用自己的私服下载jar,则没有使用默认的settings.xml文件。而是新增了一个settingsold.xml文件 问题描述 公司项目有用自己的私服,Maven正常去私服下载jar包是没问题的。但是一直是去找的阿里云镜像,到导致阿里云镜像找不到相关的jar包报错!!!…

前端:Nuxt2 + Vuetify2

想要开发一个网站&#xff0c;并且支持SEO搜索&#xff0c;当然离不开我们的 Nuxt &#xff0c;那通过本篇文章让我们一起了解一下。如果构建一个Nuxt项目 安装 Nuxt&#xff0c;创建项目 安装nuxt2&#xff0c; 需要node v16&#xff0c;大家记得查看自己的node版本。构建脚…

Linux-笔记 OverlayFS文件系统小应用 恢复功能

前言 通过另一章节 OverlayFS文件系统入门 中已经大致了解了原理&#xff0c;这里来实现一个小应用。通过前面介绍我们已经知道lowerdir是只读层&#xff0c;upperdir是可读写层&#xff0c;merged是合并层&#xff08;挂载点&#xff09;&#xff0c;那么我们可以利用这个机…

.NET C# 使用GDAL将mdb转换gdb数据

.NET C# 使用GDAL将mdb转换gdb数据 目录 .NET C# 使用GDAL将mdb转换gdb数据1 环境2 Nuget3 Code 1 环境 VisualStudio2022 .NET6 GDAL 3.8.5 2 Nuget 3 Code FeatureExtension.cs public static class FeatureExtension {[DllImport("gdal.dll", EntryPoint &…

【权威主办|检索稳定】2024年法律、教育与社会发展国际会议 (LESD 2024)

2024年法律、教育与社会发展国际会议 (LESD 2024) International Conference on Law, Education and Social Development in 2024 【重要信息】 大会地点&#xff1a;成都 官网地址&#xff1a;http://www.iclesd.com 投稿邮箱&#xff1a;iclesdsub-conf.com 【注意&#xff1…

Objects and Classes (对象和类)

Objects and Classes [对象和类] 1. Procedural and Object-Oriented Programming (过程性编程和面向对象编程)2. Abstraction and Classes (抽象和类)2.1. Classes in C (C 中的类)2.2. Implementing Class Member Functions (实现类成员函数)2.3. Using Classes References O…

Renesas MCU使用SCI_I2C驱动HS3003

目录 概述 1 软硬件介绍 1.1 软件版本信息 1.2 认识HS3003 1.2.1 HS3003特性 1.2.2 HS3003寄存器 1.2.2.1 温湿度数据寄存器 1.2.2.2 参数寄存器 1.2.2.3 一个参数配置Demo 1.2.3 温湿度值转换 1.2.4 HS3003应用电路 1.2.4.1 PIN引脚定义 1.2.4.2 sensor 应用电路 …

Django-开发一个列表页面

需求 基于ListView,创建一个列表视图,用于展示"BookInfo"表的信息要求提供分页提供对书名,作者,描述的查询功能 示例展示: 1. 数据模型 models.py class BookInfo(models.Model):titlemodels.CharField(verbose_name"书名",max_length100)authormode…

【八股系列】Vue中的<keep-alive>组件:深入解析与实践指南

&#x1f389; 博客主页&#xff1a;【剑九 六千里-CSDN博客】 &#x1f3a8; 上一篇文章&#xff1a;【探索响应式布局的奥秘&#xff1a;关键技术与实战代码示例】 &#x1f3a0; 系列专栏&#xff1a;【面试题-八股系列】 &#x1f496; 感谢大家点赞&#x1f44d;收藏⭐评论…

正则表达式;grep、sed、awk、soft、uniq、tr 详解

正则表达式 概念 正则表达式&#xff08;Regular Expression&#xff0c;常简写为regex、regexp或RE&#xff09;是一种强大的文本处理工具&#xff0c;它使用一种特殊的字符序列来帮助用户检查一个字符串是否与某种模式匹配。 标准正则表达式 首先安装正则表达式pcre库 创…

C++ | Leetcode C++题解之第200题岛屿数量

题目&#xff1a; 题解&#xff1a; class Solution { private:void dfs(vector<vector<char>>& grid, int r, int c) {int nr grid.size();int nc grid[0].size();grid[r][c] 0;if (r - 1 > 0 && grid[r-1][c] 1) dfs(grid, r - 1, c);if (r …