WebSocket首次使用踩坑记录
背景
IOT服务,后台收到信息推送至前端进行实时日志打印。
实现步骤
Springboot版本:2.5.15
1、增加依赖,我的是jdk1.8编写时发现需要用到javax.websocket
但是我默认没有的,故此添加第二个依赖,引入javax.websocket。
org.springframework.boot
spring-boot-starter-websocket
javax.websocket
javax.websocket-api
1.1
provided
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 {
@Bean
public 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 {
/**
* 连接建立成功调用的方法
*/
@OnOpen
public void onOpen(Session session, @PathParam("xxxx") String xxxx) {
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose(@PathParam("clientId") String clientId) {
}
/**
* 收到客户端消息后调用的方法
*
* @param message 客户端发送过来的消息
*/
@OnMessage
public void onMessage(String message, Session session) {
}
/**
* @param session
* @param error
*/
@OnError
public 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
确实不能序列化