zoukankan      html  css  js  c++  java
  • springboot整合websocket

    1、添加依赖

            <dependency>
                <!-- websocket -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-websocket</artifactId>
            </dependency>
    
    
            <dependency>
                <!-- fastjson -->
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.47</version>
            </dependency>

    2、添加配置文件

    package com.cosmo.sandtable.configure;
    
    import com.cosmo.sandtable.service.ReceiveDataService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.socket.server.standard.ServerEndpointExporter;
    
    import javax.annotation.PostConstruct;
    
    /**
     * @author 12077
     */
    @Configuration
    public class WebSocketConfig {
    
        /**
         * 注入一个ServerEndpointExporter,该Bean会自动注册使用@ServerEndpoint注解申明的websocket endpoint
         */
        @Bean
        public ServerEndpointExporter serverEndpointExporter() {
            return new ServerEndpointExporter();
        }
    }
    package com.cosmo.sandtable.websocket;
    import com.cosmo.sandtable.service.ReceiveDataService;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import javax.websocket.*;
    import javax.websocket.server.ServerEndpoint;
    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
    import java.util.concurrent.atomic.AtomicInteger;
    /**
     * 前后端交互的类实现消息的接收推送(自己发送给所有人(不包括自己))
     *
     * @author 12077
     * @ServerEndpoint(value = "/test/oneToMany") 前端通过此URI 和后端交互,建立连接
     */
    @Slf4j
    @ServerEndpoint(value = "/sandTable")
    @Service
    public class OneToManyWebSocket {
    
        /**
         * 记录当前在线连接数
         */
        private static AtomicInteger onlineCount = new AtomicInteger(0);
    
        /**
         * 存放所有在线的客户端
         */
        private static Map<String, Session> clients = new ConcurrentHashMap<>();
    
        private static ReceiveDataService receiveDataService;
    
        /**
         * 解决authwire不能注入问题 ReceiveDataService
         * @param receiveDataService
         */
        @Autowired
        public void setApplicationContext(ReceiveDataService receiveDataService){
            OneToManyWebSocket.receiveDataService=receiveDataService;
        }
    
        /**
         * 连接建立成功调用的方法
         */
        @OnOpen
        public void onOpen(Session session) {
            onlineCount.incrementAndGet(); // 在线数加1
            clients.put(session.getId(), session);
            log.info("有新连接加入:{},当前在线人数为:{}", session.getId(), onlineCount.get());
            receiveDataService.lightResetLoop(1);
        }
    
        /**
         * 连接关闭调用的方法
         */
        @OnClose
        public void onClose(Session session) {
            onlineCount.decrementAndGet(); // 在线数减1
            clients.remove(session.getId());
            log.info("有一连接关闭:{},当前在线人数为:{}", session.getId(), onlineCount.get());
        }
    
        /**
         * 收到客户端消息后调用的方法
         *
         * @param message 客户端发送过来的消息
         */
        @OnMessage
        public void onMessage(String message, Session session) {
            log.info("服务端收到客户端[{}]的消息:{}", session.getId(), message);
            this.sendMessage(message, session);
        }
    
        @OnError
        public void onError(Session session, Throwable error) {
            log.error("发生错误");
            error.printStackTrace();
        }
    
        /**
         * 群发消息
         *
         * @param message 消息内容
         */
        private void sendMessage(String message, Session fromSession) {
            for (Map.Entry<String, Session> sessionEntry : clients.entrySet()) {
                Session toSession = sessionEntry.getValue();
                // 排除掉自己
                if (!fromSession.getId().equals(toSession.getId())) {
                    log.info("服务端给客户端[{}]发送消息{}", toSession.getId(), message);
                    toSession.getAsyncRemote().sendText(message);
                }
            }
        }
    
        public void sendMessage(String message) {
            for (Map.Entry<String, Session> sessionEntry : clients.entrySet()) {
                Session toSession = sessionEntry.getValue();
                toSession.getAsyncRemote().sendText(message);
            }
        }
    }

    websocket不能注入报空指针:https://blog.csdn.net/qq_40136782/article/details/109078750

    https://www.cnblogs.com/xuwenjin/p/12664650.html

  • 相关阅读:
    Java多线程 编写三各类Ticket、SaleWindow、TicketSaleCenter分别代表票信息、售票窗口、售票中心。 售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程。
    java中异常处理机制 throw抛出自定义业务逻辑异常 throws继续抛出 catch捕获后会自动继续抛向调用方法
    Map集合应用 取出一个字符串中字母出现的次数。如:字符串:"abcdekka27qoq" ,输出格式为:a(2)b(1)k(2)...
    Java中List集合排序的方法 比较器的使用 根据学生对象数学 语文 英语成绩总和进行sort排序
    美国银行
    Time Difference
    马来西亚与新加坡两国的标准时间为UTC+8
    java主要城市时区对照表
    韩国时区 KST
    AIX 系统
  • 原文地址:https://www.cnblogs.com/liubaihui/p/15507958.html
Copyright © 2011-2022 走看看