• 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确实不能序列化
  • 相关阅读:
    Topaz Video AI:一键提升视频品质,智能重塑影像魅力 mac/win版
    Cesium渲染模块之VAO
    【附源码】计算机毕业设计SSM社区老人健康服务跟踪系统
    智慧城市项目建设介绍
    【3】Spring Boot 3 集成mybatis-plus+druid+mysql
    java正则校验金额
    黑群晖自动调整cpu模式
    pip安装教程 python(针对于Windows系统)
    EdrawMax Ultimate v12.0 图表和流程图
    git 上传大文件
  • 原文地址:https://blog.csdn.net/weixin_44223509/article/details/139466486