WebSocket--整合springboot

news/2024/2/25 20:49:58/文章来源:https://blog.csdn.net/weixin_55990599/article/details/135550668

目录

握手拦截器

WebSocket处理程序



HttpSessionHandshakelnterceptor (抽象类):   握手拦截器,在握手前后添加操作
AbstractWebSocketHandler (抽象类) :   WebSocket处理程序,监听连接前,连接中,连接后WebSocketConfigurer (接口):    配置程序,比如配置监听哪个端口,上面的握手拦截器,处理程序的使用

握手拦截器

 握手拦截器,在握手前后添加操作

//握手拦截器
@Component
@Slf4j
public class MyWsInterceptor extends HttpSessionHandshakeInterceptor {//用户开始连接@Overridepublic boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {//从reuqest获取远程的地址log.info("{}==》开始握手", request.getRemoteAddress().toString());return super.beforeHandshake(request, response, wsHandler, attributes);}@Overridepublic void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {//从reuqest获取远程的地址log.info("{}==》握手成功后的返回", request.getRemoteAddress().toString());super.afterHandshake(request, response, wsHandler, ex);}
}

WebSocket处理程序

//WebSocket处理程序
@Slf4j
@Component      //注入spring进来
public class MyWsHandler extends AbstractWebSocketHandler {//同样的,为了快速访问,使用map去取值private static Map<String, SessionBean> map;//县线程安全的Integerprivate static AtomicInteger clientIdMaker;static {map = new ConcurrentHashMap<>();clientIdMaker = new AtomicInteger(0);}@Override//连接建立后,保存session连接,保存在类对象map中public void afterConnectionEstablished(WebSocketSession session) throws Exception {super.afterConnectionEstablished(session);//返回并自增//半自定义操作SessionBean sessionBean = new SessionBean(session, clientIdMaker.getAndIncrement());map.put(session.getId(), sessionBean);//自定义操作//sb.append(map.get(session.getId()).getClientId() + "进入了群聊<br/>");//sengMessage(map);}@Override//收到消息protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {super.handleTextMessage(session, message);//sb.append(map.get(session.getId()).getClientId() + ":传输的内容:" + message.getPayload() + "<br/>");//log.info(String.valueOf(sb));//sengMessage(map);}@Override//传输出现异常public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {log.info("传输出现异常");super.handleTransportError(session, exception);if (session.isOpen()) {log.info("传输出现异常,关闭session");session.close();map.remove(session.getId());}}@Override//连接关闭public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {super.afterConnectionClosed(session, status);map.remove(session.getId());//Integer clientId = map.get(session.getId()).getClientId();//log.info("()==>连接关闭", clientId);//sb.append(clientId + "退出了群聊" + "<br/>");//sengMessage(map);}//实现定时任务@Scheduled(fixedRate = 2000)  //每隔多少秒执行定时任务public void sengMsg() throws IOException {//向每个客户端发送请求for (String s : map.keySet()) {                 //遍历对象map.get(s)                                  //或与session对象.getWebSocketSession()              //获取session.sendMessage(new TextMessage("测试心跳"));                     //发送任务}}static void sengMessage(Map<String, SessionBean> map) {for (String key : map.keySet()) {try {map.get(key).getWebSocketSession().sendMessage(new TextMessage(sb.toString()));} catch (IOException e) {e.printStackTrace();log.info(e.getMessage());}}}}

配置类

@Configuration
@EnableWebSocket
public class MyWsConfig implements WebSocketConfigurer {@Resourceprivate MyWsHandler handler;@Resourceprivate MyWsInterceptor interceptor;@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(handler, "/myWs1")   //传入处理器,以及handler监听的地址.addInterceptors(interceptor)           //添加拦截器  注入自定义的握手拦截器.setAllowedOrigins("*");                //允许的源}
}

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

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

相关文章

nginx代理七牛云http资源,节省https费用(亲测有效)

七牛云https费用太高了&#xff0c;通过配置服务器https代理到http访问&#xff01; location ~ /qiniu/(.*) { proxy_pass http://qiniu.myweb.cn/$1; proxy_set_header Host $proxy_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarde…

小程序学习-13

生命周期函数&#xff1a;自动按次序执行 onLoad和onReady比较常用在onReady中可以改标题&#xff08;如下图&#xff09; WXS是用来帮助开发者渲染页面结构的 过滤器&#xff1a;渲染数据之前&#xff0c;对数据做一层包装处理&#xff0c;过滤器处理的结果最终会渲染到页面上…

SpringBoot-项目部署

SpringBoot项目部署可以通过将项目打成可执行的jar包或war包来实现&#xff0c;也可以使用容器化技术如Docker将项目部署到云平台中。在部署时需要注意配置文件的位置和启动参数的设置&#xff0c;同时确保目标环境中的Java版本与项目所需的Java版本一致。部署完成后&#xff0…

Rust-类型

bool 布尔类型(bool)代表的是“是”和“否”的二值逻辑。它有两个值&#xff1a;true和false。 一般用在逻辑表达式中&#xff0c;可以执行“与”“或”“非”等运算。 char 字符类型由char表示。它可以描述任何一个符合unicode标准的字符值。在代码中&#xff0c;单个的字符…

python对自动驾驶进行模拟

使用了 Pygame 库来创建一个简单的游戏环境,模拟了一辆自动驾驶汽车在道路上行驶。汽车的位置和速度通过键盘控制&#xff0c;可以左右移动和加速减速。道路的宽度和颜色可以根据需要进行调整。 import pygame import random # 游戏窗口大小 WINDOW_WIDTH 800 WINDOW_HEIG…

【软考中级-软件设计师】day4:数据结构-线性表、单链表、栈和队列、串

大纲 线性结构 顺序存储和链式存储区别 单链表的插入和删除 真题 栈和队列 真题 串

linux强制结束某个程序的进程

远程连接上服务器&#xff0c;发现向日葵右下角的弹窗关不掉了。 查看进程 命令行输入&#xff1a; top发现两个向日葵(sunloginclient)的进程。 按q退出top 根据pid杀死进程 进入root模式 sudo sukill -9 1027 kill -9 5621成功关闭弹窗

【Java JVM】栈帧

执行引擎是 Java 虚拟机核心的组成部分之一。 在《Java虚拟机规范》中制定了 Java 虚拟机字节码执行引擎的概念模型, 这个概念模型成为各大发行商的 Java 虚拟机执行引擎的统一外观 (Facade)。 不同的虚拟机的实现中, 通常会有 解释执行 (通过解释器执行)编译执行 (通过即时编…

Python笔记08-面向对象

文章目录 类和对象构造方法内置方法封装继承类型注解多态 类只是一种程序内的“设计图纸”&#xff0c;需要基于图纸生产实体&#xff08;对象&#xff09;&#xff0c;才能正常工作 这种套路&#xff0c;称之为&#xff1a;面向对象编程 类和对象 定义类的语法如下&#xff…

SQL Server的彻底卸载的方式

这篇文章主要介绍了SQL Server的彻底卸载的方式&#xff0c;具有很好的参考价值&#xff0c;希望对大家有所帮助。如有错误或未考虑完全的地方&#xff0c;望不吝赐教 SQL Server的彻底卸载与再次安装 可能大家已经有深刻体会&#xff0c;SQL Server的卸载十分繁琐。最让人头…

前端js调用Lodop实现云打印

一、下载Lodop控件 官网&#xff1a;下载中心 - Lodop和C-Lodop官网主站 二、解压后安装 双击进行安装&#xff0c;里面有些页面文件是一些教程案例 勾选云服务工作模式 安装成功会自动启动 浏览器访问地址&#xff1a;http://localhost:8000/ 首页最下面有个教程案例跳转地址&…

Edge浏览器入门

关于作者&#xff1a; CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP&#xff0c;带领团队单日营收超千万。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业化变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览…

网络安全的威胁PPT

建议的PPT免费模板网站&#xff1a;http://www.51pptmoban.com/ppt/ 此PPT模板下载地址&#xff1a;https://file.51pptmoban.com/d/file/2023/03/20/1ae84aa8a9b666d2103f19be20249b38.zip 内容截图&#xff1a;

【AI视野·今日Robot 机器人论文速览 第七十三期】Tue, 9 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Tue, 9 Jan 2024 Totally 40 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Digital Twin for Autonomous Surface Vessels for Safe Maritime Navigation Authors Daniel Menges, Andreas Von Brandis, A…

LeetCode刷题13:回溯+剪枝解决216.组合总和 III

找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7 输出: [[1,2,4]] 解…

纯c实现顺序表 数据结构大全

我们已经知道数组是连续的内存地址&#xff0c;顺序表是由数组为基础的一种数据结构&#xff0c;拥有比数组更多的功能&#xff0c;在概念上属于线性结构&#xff0c;跟链表不同的是&#xff0c;顺序表在物理结构上也是线性的 什么是数据结构&#xff1f; 当我们想要使⽤⼤量使…

快速了解VR全景拍摄技术运用在旅游景区的优势

豆腐脑加了糖、烤红薯加了勺&#xff0c;就连索菲亚大教堂前都有了“人造月亮”&#xff0c;在这个冬季&#xff0c;“尔滨”把各地游客宠上了天。面对更多的游客无法实地游玩&#xff0c;哈尔滨冰雪世界再添新玩法&#xff0c;借助VR全景拍摄技术对冬季经典冰雪体验项目进行全…

基于NLP的恶意网页识别

基于NLP的恶意网页识别 基于NLP的恶意网页识别引言项目目录回顾优化HTML标签提取结果使用预训练模型Fine-tune数据处理和模型训练模型训练与评估模型导出部署与预测总结 基于NLP的恶意网页识别 引言 欢迎阅读《 基于NLP的恶意网页识别》&#xff0c;在前三篇中&#xff0c;我…

python爬虫-代理ip理解

目录 1、为什么使用代理IP 2、代理IP 3、IP池 4、代理分类&#xff1a; 5、python中使用代理IP 6、如何找可以使用的代理IP 7、拿到IP后&#xff0c;测试IP的有效性 8、扩展理解正向代理和反向代理 1、为什么使用代理IP 就是为了防止ip被封禁&#xff0c;提高爬虫的效…

uniapp中uview组件库的AlertTips 警告提示使用方法

目录 #使用场景 #平台差异说明 #基本使用 #图标 #可关闭的警告提示 #API #Props #Events 警告提示&#xff0c;展现需要关注的信息。 #使用场景 当某个页面需要向用户显示警告的信息时。非浮层的静态展现形式&#xff0c;始终展现&#xff0c;不会自动消失&#xff0…