WebSocket首次使用踩坑记录

作者 : admin 本文共2293个字,预计阅读时间需要6分钟 发布时间: 2024-06-9 共1人阅读

背景

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确实不能序列化
本站无任何商业行为
个人在线分享 » WebSocket首次使用踩坑记录
E-->