WebSocket首次使用踩坑记录

背景

IOT服务,后台收到信息推送至前端进行实时日志打印。

实现步骤

Springboot版本:2.5.15
1、增加依赖,我的是jdk1.8编写时发现需要用到javax.websocket但是我默认没有的,故此添加第二个依赖,引入javax.websocket。

 <!-- webSocket依赖包 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><!-- java提供的websocket接口 --><dependency><groupId>javax.websocket</groupId><artifactId>javax.websocket-api</artifactId><version>1.1</version><scope>provided</scope></dependency>

2、Application.java上增加@EnableWebSocket,以下是部分代码

import org.springframework.web.socket.config.annotation.EnableWebSocket;
@EnableWebSocket
public class RuoYiApplication{}

3、创建ServerEndpointExporter


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;/*** weibSocket配置类*/
@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}

4、编写websocket服务

import org.springframework.stereotype.Component;import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;@ServerEndpoint("/xxxx/{xxxx}")
@Component
public class WebSocketServer {/*** 连接建立成功调用的方法*/@OnOpenpublic void onOpen(Session session, @PathParam("xxxx") String xxxx) {}/*** 连接关闭调用的方法*/@OnClosepublic void onClose(@PathParam("clientId") String clientId) {}/*** 收到客户端消息后调用的方法** @param message 客户端发送过来的消息*/@OnMessagepublic void onMessage(String message, Session session) {}/*** @param session* @param error*/@OnErrorpublic void onError(Session session, Throwable error, @PathParam("clientId") String clientId) {error.printStackTrace();}/*** 实现服务器主动推送** @param message  向客户端发送的消息* @throws IOException*/public void sendMessage(String xxxx, String message) throws IOException {}
}

5、权限过滤记得添加地址
一般项目都会有权限过滤,例如:shiro。记得把ws地址添加到无须权限当中。

测试

可以用在线测试工具,推荐一个WebSocket King。

最后

  • 我觉得复制代码时候记得把import一起复制,不然很容易出现包不对,照着写不存在问题车。
  • 我这里踩坑是@Configuration在写的时候选成了@Configurable然后连接一直失败。😂然后其实配置一直都没加载上。错误信息如下:
Could not connect to "ws://127.0.0.1:8080/deviceLogs/dagssadgfsa". You may be able to find more information using Inspector/Dev Tools on this page.

20240607追加

  • WebSocketServer类中无法使用Spring中的@Autowired,具体没有详细了解。粗略的查了一下,@ServerEndpoint注解标注的类好像不是交由spring托管,但是使用时候发现@Component又注解必须写。
  • @Autowired无法使用提供思路,尝试使用spring类获取bean也失败了,😂我觉得如果可以通过spring获得bean,那自动注入应该也可以。在使用时我需要使用RedisTemplate,我使用的是创建静态类,静态类上标注为@Component,在静态类中自动注入RedisTemplate,自动注入标注在set方法上,set方法不能是静态方法。
  • Session对象无法序列化,本想着放到redis中可以方便使用,结果转JSON时候报错。想了想Session应该是不支持序列化,网上查了一下,websocket中生成的session确实不能序列化

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

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

相关文章

折腾日记:如何在Mac上连接Esp32

个人博客地址 最近购买了一块Esp32单片机&#xff0c;在Mac环境上进行开发&#xff0c;并且成功点亮LED灯和连上屏幕&#xff0c;为什么会上手选择Esp32开发板&#xff0c;主要考虑它自带Wi-Fi和蓝牙&#xff0c;单价也不高&#xff0c;就算后面不玩了&#xff0c;也能转成物联…

深度学习:如何静悄悄地改变我们的日常生活

深度学习 深度学习&#xff1a;如何静悄悄地改变我们的日常生活一、消费电子产品智能手机与个人助理娱乐与社交媒体 二、医疗健康三、汽车与交通四、公共安全五、总结 深度学习&#xff1a;如何静悄悄地改变我们的日常生活 在近年来&#xff0c;深度学习技术因其强大的数据处理…

LibreOffice电子表格如何实现快速筛选并将结果放到新的工作表

如果是在excel或者wps中&#xff0c;可能大家都习惯了自动筛选&#xff0c;然后复制到新的工作表或者删除掉复制内容的办法。但是在LibreOffice中&#xff0c;经测试&#xff0c;大数据表的删除或者复制是非常慢的。这也是很多人放弃LibreOffice的原因之一。那么我们如何快速筛…

Flutter 使用ffigen生成ffmpeg的dart接口

Flutter视频渲染系列 第一章 Android使用Texture渲染视频 第二章 Windows使用Texture渲染视频 第三章 Linux使用Texture渲染视频 第四章 全平台FFICustomPainter渲染视频 第五章 Windows使用Native窗口渲染视频 第六章 桌面端使用texture_rgba_renderer渲染视频 第七章 使用ff…

代码随想录算法训练营day46 | 完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ

完全背包 完全背包相对于01背包来说物品有无限个 代码的不同主要体现在遍历顺序上&#xff0c; 完全背包的背包重量不需要倒序遍历&#xff0c;因为物品有无限个&#xff0c;可以被无限添加&#xff1b;并且因为背包重量正序遍历&#xff0c;后续的值依赖于前面的值&#xff…

【C语言】一节课拿捏---动态内存分配

谢谢观看&#xff01;希望以下内容帮助到了你&#xff0c;对你起到作用的话&#xff0c;可以一键三连加关注&#xff01;你们的支持是我更新地动力。 因作者水平有限&#xff0c;有错误还请指出&#xff0c;多多包涵&#xff0c;谢谢&#xff01; 目录 一、 为什么要有动态内存…

PgSQL技术内幕 - psql与服务端连接与交互机制

PgSQL技术内幕 - 客户端psql与服务端连接与交互机制 简单来说&#xff0c;PgSQL的psql客户端向服务端发起连接请求&#xff0c;服务端接收到请求后&#xff0c;fork出一个子进程&#xff0c;之后由该子进程和客户端进行交互&#xff0c;处理客户端的SQL等&#xff0c;并将结果返…

【Python】一文向您详细介绍 __str__ 的作用和用法

【Python】一文向您详细介绍 str 的作用和用法 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&…

【CS.AI】AI引领编程新时代:深度探索GitHub Copilot

文章目录 引言0. TOP TAKEAWAYS 重要要点1. Copilot的基本功能2. 技术原理3. 优势与局限优势局限 4. 使用体验4.1 初次使用4.2 在 JetBrains 全家桶中使用 GitHub Copilot1. 安装插件2. 配置插件3. 使用 GitHub Copilot 4.3 日常开发4.4 体验与反馈 5. 对开发者生态系统的影响5…

梯度下降: 02. 批量梯度下降BGD,随机梯度下降SGD,小批量梯度下降MBGD

简介 本文从原理上介绍了三种梯度下降的方法,相同点,异同点,优缺点。 内容包含了数学公式的推导与说明 1. 梯度下降的3种方法 梯度下降分三类,原理基本相同,操作方式略有区别 批量梯度下降BGD(BatchGradient Descent):使用全量数据进行特征抽取,模型训练小批量梯度下降…

VueRouter3学习笔记

文章目录 1&#xff0c;入门案例2&#xff0c;一些细节高亮效果非当前路由会被销毁 3&#xff0c;嵌套路由4&#xff0c; 传递查询参数5&#xff0c;命名路由6&#xff0c;传递路径参数7&#xff0c;路径参数转props8&#xff0c;查询参数转props9&#xff0c;replace模式10&am…

【C++】深入理解decltype和decltype(auto)

深入理解decltype和decltype&#xff08;auto&#xff09; 一、decltype语法介绍二、decltype的推导规则1. expr不加括号2. expr加上括号 三、关于decltype的CV属性推导四、 decltype(auto) 的使用 一、decltype语法介绍 decltype关键字是C11新标准引入的关键字&#xff0c;它…

Hadoop3:MapReduce源码解读之Map阶段的Job任务提交流程(1)

3、Job工作机制源码解读 用之前wordcount案例进行源码阅读&#xff0c;debug断点打在Job任务提交时 提交任务前&#xff0c;建立客户单连接 如下图&#xff0c;可以看出&#xff0c;只有两个客户端提供者&#xff0c;一个是YarnClient&#xff0c;一个是LocalClient。 显然&a…

ChatGPT4写2024高考作文:在AI时代,人们对于问题的数量是否会减少?

文章目录 在AI时代&#xff0c;人们对于问题的数量是否会减少&#xff1f; 在AI时代&#xff0c;人们对于问题的数量是否会减少&#xff1f; 在人工智能&#xff08;AI&#xff09;的时代&#xff0c;人们对于问题的数量是否会减少&#xff0c;这是一个引人深思的话题。随着AI…

AttributeError: ‘ChatGLMModel‘ object has no attribute ‘prefix_encoder‘

AttributeError: ‘ChatGLMModel‘ object has no attribute ‘prefix_encoder‘&#xff1a;全面解析 问题概述 当您使用 ChatGLM 模型或相关库时遇到 AttributeError: ‘ChatGLMModel‘ object has no attribute ‘prefix_encoder‘ 错误时&#xff0c;这意味着 ChatGLMMod…

Objective-C 学习笔记 | 基础

Objective-C 学习笔记 | 基础 参考书&#xff1a;《Objective-C 编程&#xff08;第2版&#xff09;》 第1部分 入门 Objective-C语言是以C语言为基础的&#xff0c;但增加了对面向对象编程的支持。Objective-C语言是用来开发在苹果iOS以及OS X操作系统上运行的应用的编程语…

植物大战僵尸杂交版 2.0 下载及配置图文教程

文章目录 Part.I IntroductionPart.II 下载Chap.I 下载地址Chap.II 网盘直链下载 Part.III 配置Chap.I 解压与安装Chap.II 加载存档Chap.III 其他设置 Reference Part.I Introduction 最近看大仙儿直播植物大战僵尸&#xff0c;觉得挺好玩的。它大概长这样&#xff1a; 就上网…

使用proteus仿真51单片机的流水灯实现

proteus介绍&#xff1a; proteus是一个十分便捷的用于电路仿真的软件&#xff0c;可以用于实现电路的设计、仿真、调试等。并且可以在对应的代码编辑区域&#xff0c;使用代码实现电路功能的仿真。 汇编语言介绍&#xff1a; 百度百科介绍如下&#xff1a; 汇编语言是培养…

GPT-4o:OpenAI的最新篇章与深度探索

引言&#xff1a; 在人工智能领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术持续引领着技术创新的步伐。自2023年引入以来&#xff0c;GPT系列模型一直以其卓越的语言生成能力而闻名&#xff0c;近期的迭代——GPT-4o&#xff0c;更是为这一领域的研究和应用带…

指令调度和延迟分支

指令调度和延迟分支是计算机体系结构中的两个重要概念,特别是在处理CPU效率优化方面。以下是关于这两个概念的详细解释: 指令调度(Instruction Scheduling) 定义: 指令调度是指对程序块或过程中的操作进行排序以有效利用处理器资源的任务。其目的是通过重排指令,提高指…