当前位置: 首页 > news >正文

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确实不能序列化

相关文章:

  • 苹果将推出“Apple Intelligence”AI系统,专注于隐私和广泛应用|TodayAI
  • KafkaStream Local Store和Global Store区别和用法
  • docker pull image 报错 dial tcp 31.13.88.169:443: i/o timeout
  • Python 识别图片形式pdf的尝试(未解决)
  • 【JSP】如何在IDEA上部署JSP WEB开发项目
  • 贪心算法-加油站
  • c#与汇川plc通信
  • STM32 HAL库开发——入门篇(3):OLED、LCD
  • 骑砍2霸主MOD开发(11)-瓦兰迪亚火骑兵
  • k8s使用yml文件部署
  • 【Vue】——组件的注册与引用
  • 默认launcher
  • 鸿蒙OS初识
  • Python的Pillow(图像处理库)的一些学习笔记
  • docker实战命令大全
  • 0x05 Python数据分析,Anaconda八斩刀
  • javascript 哈希表
  • JavaScript实现分页效果
  • MD5加密原理解析及OC版原理实现
  • ReactNative开发常用的三方模块
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 代理模式
  • 给初学者:JavaScript 中数组操作注意点
  • 工作中总结前端开发流程--vue项目
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 基于axios的vue插件,让http请求更简单
  • 计算机常识 - 收藏集 - 掘金
  • 前端临床手札——文件上传
  • 算法系列——算法入门之递归分而治之思想的实现
  • 异常机制详解
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • # Redis 入门到精通(一)数据类型(4)
  • (07)Hive——窗口函数详解
  • (C语言)共用体union的用法举例
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Java数据结构)ArrayList
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (二)原生js案例之数码时钟计时
  • (九)One-Wire总线-DS18B20
  • (篇九)MySQL常用内置函数
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (转)Linq学习笔记
  • ***测试-HTTP方法
  • ../depcomp: line 571: exec: g++: not found
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .net 微服务 服务保护 自动重试 Polly
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .NET技术成长路线架构图
  • .Net中的集合