相关文章推荐
慷慨大方的汤圆  ·  python ...·  1 周前    · 
刚毅的刺猬  ·  Firebase Cloud ...·  1 周前    · 
神勇威武的针织衫  ·  Apache JMeter ...·  1 年前    · 
另类的饭盒  ·  Java 算法 - 递归算法 - ...·  1 年前    · 
逃课的手套  ·  java调用shell - OSCHINA ...·  1 年前    · 
好帅的小马驹  ·  javascript - ...·  1 年前    · 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
            <version>2.4.3</version>
        </dependency>

创建配置类

@Configuration
@EnableWebSocketMessageBroker
@Slf4j
public class WsConfig implements WebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/websocket/**")
                .setAllowedOriginPatterns("*")
                .setHandshakeHandler(new PrincipalHandshakeHandler())
//                .withSockJS() 此处为websocket连接是否浏览器访问,不开启则为  ws:// wss://,开启为  http://   https://
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        // 订阅Broker名称 user点对点 topic广播即群发
        registry.enableSimpleBroker("/topic", "/user");
        registry.setUserDestinationPrefix("/user");
    @Override
    public void configureWebSocketTransport(WebSocketTransportRegistration registry) {
        registry.addDecoratorFactory(new DeWsHandlerFactory());
        registry.setMessageSizeLimit(8192) //设置消息字节数大小
                .setSendBufferSizeLimit(8192)//设置消息缓存大小
                .setSendTimeLimit(10000); //设置消息发送时间限制毫秒
    @EventListener
    public void onDisconnectEvent(SessionDisconnectEvent event) {
        String sessionId=event.getSessionId();
        log.info("监听到websocket连接断开,id为[{}]",sessionId);
//断开事件监听
    @EventListener
    public void handleWebSocketConnectListener(SessionConnectedEvent event) {
        StompPrincipal principal = toBean(toJsonStr(event.getUser()), StompPrincipal.class);
        log.info("WebSocket 客户端已连接: {}",
                "{ 客户端主机名: " + principal.getName() +
                        ", 客户端主机IP地址: " + principal.getPublicName() +
                        ", 会话ID: " + requireNonNull(event.getMessage().getHeaders().get("simpSessionId")) + " }");
public interface WsDeviceService {
    void sendMessage(WsMessage wsMessage, String username);
@Service
@Slf4j
public class WsDeviceServiceImpl implements WsDeviceService {
    @Resource
    private SimpMessagingTemplate messagingTemplate;
    @Override
    public void sendMessage(WsMessage wsMessage, String username) {
        if(ObjectUtils.isEmpty(wsMessage) ||  ObjectUtils.isEmpty(wsMessage.getTopic())) return;
        log.info("发送数据消息,数据内容为-->[{}]",wsMessage.getData());
        messagingTemplate.convertAndSend("/topic/device/"+username,wsMessage.getData());
        log.info("完成数据发送。");

controller代码不做赘述,太简单

调试阶段出现的问题

websocket连接不上

Invalid SockJS path ‘/xxxx/Xxxx’ - required to have 3 path segments
配置类修改,注释掉withSockJS(),不开启sockjs

        registry.addEndpoint("/websocket/**")
                .setAllowedOriginPatterns("*")
                .setHandshakeHandler(new PrincipalHandshakeHandler())
//                .withSockJS()
                                    首先 sockjs-node 是一个JavaScript库,提供跨浏览器JavaScript的API,创建了一个低延迟、全双工的浏览器和web服务器之间通信通道。
服务端:sockjs-node(https://github.com/sockjs/sockjs-node)
客户端:sockjs-clien(https://github.com/sockjs/sockjs-client)
1. 找到/node_modules/sockjs-client/dist/sockjs.js
2.找到代码的大概1
                                    sockjs-node 是一个JavaScript库,提供跨浏览器JavaScript的API,创建了一个低延迟、全双工的浏览器和web服务器之间通信通道。当在项目运行过程中修改Ip地址会造成info报错,如下:
解决方法为重新启动项目
                                    首先sockjs-node是一个JavaScript库,提供跨浏览器JavaScript的API,创建了一个低延迟、全双工的浏览器和web服务器之间通信通道。
服务端:sockjs-node(https://github.com/sockjs/sockjs-node)客户端:sockjs-clien(https://github.com/sockjs/sockjs-client)
如果你的...