zoukankan      html  css  js  c++  java
  • 基于springMVC的websocket

    pom.xml

              <!-- websocket -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-websocket</artifactId>
                <version>4.1.9.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-messaging</artifactId>
                <version>4.1.9.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>javax.websocket</groupId>
                <artifactId>javax.websocket-api</artifactId>
                <version>1.1</version>
                <scope>provided</scope>
            </dependency>

    worker.java

    public class Worker {
        private String id;
        private String type;
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        public String getType() {
            return type;
        }
        public void setType(String type) {
            this.type = type;
        }
        @Override
        public String toString() {
            return "Worker [id=" + id + ", type=" + type + "]";
        }
        public Worker() {
            super();
            // TODO Auto-generated constructor stub
        }
        public Worker(String id, String type) {
            super();
            this.id = id;
            this.type = type;
        }
    
    }
    @Configuration
    @EnableWebMvc
    @EnableWebSocket
    public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer{
        public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
            System.out.println("==========================注册socket");
            //注册websocket server实现类,"/webSocketServer"访问websocket的地址
            registry.addHandler(msgSocketHandle(),
                    "/webSocketServer.do").addInterceptors(new WebSocketHandshakeInterceptor());
            //使用socketjs的注册方法
            registry.addHandler(msgSocketHandle(),
                    "/sockjs/webSocketServer.do").addInterceptors(new WebSocketHandshakeInterceptor())
                    .withSockJS();
        }
        
        @Bean(name = "msgSocketHandle")
        public WebSocketHandler msgSocketHandle(){
            return new MsgScoketHandle();
        }
    }
    public class WebSocketHandshakeInterceptor extends HttpSessionHandshakeInterceptor {
    
        @Override
        public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {
            System.out.println("After Handshake");
            super.afterHandshake(request, response, wsHandler, ex);
        }
    
        @Override
        public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes)throws Exception {
            System.out.println("Before Handshake");
            if (request instanceof ServletServerHttpRequest) {
                ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
                HttpSession session = servletRequest.getServletRequest().getSession(false);
                Worker worker = (Worker) session.getAttribute("worker");
                if(worker != null)
                    attributes.put("worker", worker);
            }
            return super.beforeHandshake(request, response, wsHandler, attributes);
        }
    }
    @Component
    public class MsgScoketHandle extends TextWebSocketHandler {
         private static final Map<String,WebSocketSession> workers = new HashMap<String,WebSocketSession>();
    
    
        @Override
        public void afterConnectionEstablished(WebSocketSession session)
                throws Exception {
            //System.out.println("=====================建立连接成功==========================");
            Worker worker  = (Worker) session.getAttributes().get("worker");
            workers.put(worker.getId(), session);
            if(worker != null){
                System.out.println("当前连接用户======"+worker.getId());
            }
        }
    
        @Override
        public void handleMessage(WebSocketSession session,
                WebSocketMessage<?> message) throws Exception {
                Worker worker = (Worker) session.getAttributes().get("worker");
                System.out.println("收到用户:"+worker.getId()+"的消息");
                System.out.println("===========================================");
        }
    
        @Override
        public void handleTransportError(WebSocketSession session,
                Throwable exception) throws Exception {
             if (session.isOpen()){
                    //关闭session
                    try {
                       session.close();
                    } catch (IOException e) {
                    }
                }
                //移除用户
             Worker worker = (Worker) session.getAttributes().get("worker");
                workers.remove(worker.getId());
        }
    
        @Override
        public void afterConnectionClosed(WebSocketSession session,
                CloseStatus closeStatus) throws Exception {
            workers.remove(session);
            Worker user = (Worker) session.getAttributes().get("user");
            System.out.println(user.getId()+"断开连接");
        }
    
        @Override
        public boolean supportsPartialMessages() {
            return false;
        }
            
         /**
         * 发送信息给指定用户
         * @param clientId
         * @param message
         * @return
         */
        public boolean sendMessageToUser(String workerId, TextMessage message) {
            if (workers.get(workerId) == null) return false;
            WebSocketSession session = workers.get(workerId);
            System.out.println("sendMessage:" + session);
            if (!session.isOpen()) return false;
            try {
                session.sendMessage(message);
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
            return true;
        }
        /**
         * 发送消息给所有用户
         * @param messageInfo
         */
        public boolean sendMessageToAllUsers(TextMessage message) {
            boolean allSendSuccess = true;
            Set<String> clientIds = workers.keySet();
            WebSocketSession session = null;
            for (String clientId : clientIds) {
                try {
                    session = workers.get(clientId);
                    if (session.isOpen()) {
                        session.sendMessage(message);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    allSendSuccess = false;
                }
            }
    
            return  allSendSuccess;
        }
    }
    @RequestMapping("websocket")
    @Controller  
    public class UserController {
        @Autowired
        private MsgScoketHandle msgScoketHandle;
        
         @Bean//这个注解会从Spring容器拿出Bean
            public MsgScoketHandle infoHandler() {
                return new MsgScoketHandle();
            }
    
        
         @RequestMapping("websocket/{userId}")
         public String websocket(HttpServletRequest request)throws Exception{
             String id = request.getParameter("userId");
             Worker worker = new Worker();
             worker.setId(id);
             request.getSession().setAttribute("worker",worker);
             return null;
         }
         
        @RequestMapping("login")
        public String login(HttpServletRequest request)throws Exception{
            Worker worker = new Worker();
            String id = request.getParameter("id");
            String style = request.getParameter("style");
            worker.setId(id);
            worker.setType(style);
            request.getSession().setAttribute("worker",worker);
            return "/send";
        }
    
        @ResponseBody
        @RequestMapping("sendMsg")
        public String sendMag(String content){
            System.out.println(content+"***************");
            if(content==null){
                return null;
            }else{
                TextMessage textMessage = new TextMessage(content);
                try {
                    msgScoketHandle.sendMessageToAllUsers(textMessage);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return content;
            }
        }
    }

     大家觉得不错的话可以支持一下我

  • 相关阅读:
    路由追踪BestTrace命令详解
    python MD5 信息摘要
    BFD 协议介绍
    IPSec 详细分析 二
    什么是分光器
    聊聊编码与解码(弄懂bytes,utf8,ascii,unicode)
    OS实践1: Windows 11 配置 WSL
    Mac上录屏录音
    同步相关 及音量
    iOS相关文档
  • 原文地址:https://www.cnblogs.com/xiangxiang521/p/9376551.html
Copyright © 2011-2022 走看看