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)
       }
    }
    
  • 相关阅读:
    git总是需要输入用户名密码问题解决
    安装Elasticsearch与Kibana汉化记录
    ubuntu下通过certbot自动化生成letsencrypt证书配置nginx服务器https记录
    ubuntu通过apt安装最新稳定版nginx记录
    linux磁盘管理与lvm琐事
    docker搭建常用环境记录
    线程池如何复用一个线程-- ThreadPoolExecutor的实现(未完)
    为什么切换线程比切换进程开销小
    Tomcat &servlet字符集编码问题
    字符和字符串在Java中的旅程
  • 原文地址:https://www.cnblogs.com/warrior/p/8288580.html
Copyright © 2011-2022 走看看