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;
            }
        }
    }

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

  • 相关阅读:
    cinder支持nfs快照
    浏览器输入URL到返回页面的全过程
    按需制作最小的本地yum源
    创建可执行bin安装文件
    RPCVersionCapError: Requested message version, 4.17 is incompatible. It needs to be equal in major version and less than or equal in minor version as the specified version cap 4.11.
    惠普IPMI登陆不上
    Linux进程状态——top,ps中看到进程状态D,S,Z的含义
    openstack-neutron基本的网络类型以及分析
    openstack octavia的实现与分析(二)原理,架构与基本流程
    flask上下文流程图
  • 原文地址:https://www.cnblogs.com/xiangxiang521/p/9376551.html
Copyright © 2011-2022 走看看