zoukankan      html  css  js  c++  java
  • Spring boot实现原生websocket

    网上的大部分教程是基于sockjs,这篇文章内容则是基于原生协议。

    后台Spring boot 配置

    @Configuration
    @EnableWebSocket
    public class WebSocketConfig implements WebSocketConfigurer {
    
    
        @Resource
        private WsSiteHandler wsSiteHandler;
    
        @Override
        public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
            registry.addHandler(wsSiteHandler, "site/change").setAllowedOrigins("*");
        }
    }
    
    @Component
    public class WsSiteHandler  extends TextWebSocketHandler {
        private final static Logger logger = LoggerFactory.getLogger(WsSiteHandler.class);
        private List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();
        private ExecutorService executor = Executors.newCachedThreadPool();
    
    
        public void asyncNotice(SiteTo to) {
            executor.execute(() -> {
                String json = new Gson().toJson(to);
                handleTextMessage(null, new TextMessage(json));
            });
        }
    
        @Override
        public void handleTextMessage(WebSocketSession session, TextMessage message) {
            if (session == null) {
                sessions.removeIf(el -> !el.isOpen());
                sessions.forEach(el -> {
                    try {
                        if (el.isOpen()) {
                            el.sendMessage(message);
                        } else {
                            el.close();
                        }
                    } catch (IOException e) {
                        logger.error("发送车位信息错误!", message.toString(), e);
                    }
                });
            } else {
                try {
                    session.sendMessage(message);
                } catch (IOException e) {
                    logger.error("发送车位信息错误!", message.toString(), e);
                }
            }
        }
    
        @Override
        public void afterConnectionEstablished(WebSocketSession session) {
            sessions.add(session);
        }
    }
    
    

    前台调用

    initWs () {
       if (!window.WebSocket) return
       this.socket = new WebSocket(`ws://127.0.0.1:9000/marketing/site/change`)
       this.socket.onopen = (event) => {
         console.log('onopen', event)
       }
       this.socket.onmessage = (event) => {
         console.log('onmessage', event.data)
         const siteTo = JSON.parse(event.data)
         siteTo.lock = siteTo.isLock
         const index = this.result.findIndex(el => el.site.id === siteTo.site.id)
         if (index >= 0) {
           this.result.splice(index, 1, siteTo)
         }
       }
    
       this.socket.onerror = (event) => {
         console.log('onerror', event)
       }
    }
    
  • 相关阅读:
    工作流二次开发之新增表单实践(二)
    layui表格及工作流二次开发实践(一)
    记一个递归封装树形结构
    SpringCloud微服务之宏观了解
    统一结果返回&统一异常处理
    mybatis-Plus 实践篇之CRUD操作
    修改MariaDB-root密码
    iftop-监控服务器实时带宽情况
    Wordpress安装-报错说明
    MariaDB忘记root密码
  • 原文地址:https://www.cnblogs.com/warrior/p/8288580.html
Copyright © 2011-2022 走看看