zoukankan      html  css  js  c++  java
  • WebSocket集合SSM的第一次使用

    一、添加依赖

    <!-- WebSocket配置开始-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-websocket</artifactId>
          <version>4.3.25.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-messaging</artifactId>
          <version>4.3.25.RELEASE</version>
        </dependency>
        <!-- WebSocket配置结束-->

    二、JAVA服务器代码

    1.SpringWebSocketConfig

    package com.fz.websocket;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    import org.springframework.web.socket.config.annotation.EnableWebSocket;
    import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
    import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
    import org.springframework.web.socket.handler.TextWebSocketHandler;
    
    
    @Configuration
    @EnableWebMvc
    @EnableWebSocket
    public class SpringWebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {
        public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
            registry.addHandler(webSocketHandler(),"/websocket").addInterceptors(new SpringWebSocketHandlerInterceptor());
            registry.addHandler(webSocketHandler(), "/sockjs").addInterceptors(new SpringWebSocketHandlerInterceptor()).withSockJS();
        }
    
        @Bean
        public TextWebSocketHandler webSocketHandler(){
            return new SpringWebSocketHandler();
        }
    
    }

    2.SpringWebSocketHandler

    package com.fz.websocket;
    import java.io.IOException;
    import java.util.ArrayList;
    import org.apache.log4j.Logger;
    import org.springframework.web.socket.CloseStatus;
    import org.springframework.web.socket.TextMessage;
    import org.springframework.web.socket.WebSocketSession;
    import org.springframework.web.socket.handler.TextWebSocketHandler;
    
    
    public class SpringWebSocketHandler extends TextWebSocketHandler {
        private static final ArrayList<WebSocketSession> users;//这个会出现性能问题,最好用Map来存储,key用userid
        private static Logger logger = Logger.getLogger(SpringWebSocketHandler.class);
        static {
            users = new ArrayList<WebSocketSession>();
        }
    
        public SpringWebSocketHandler() {
            // TODO Auto-generated constructor stub
        }
    
        /**
         * 连接成功时候,会触发页面上onopen方法
         */
        public void afterConnectionEstablished(WebSocketSession session) throws Exception {
            // TODO Auto-generated method stub
            System.out.println("connect to the websocket success......当前数量:"+users.size());
            users.add(session);
            //这块会实现自己业务,比如,当用户登录后,会把离线消息推送给用户
            int i=0;
            while (true){
    
                TextMessage returnMessage = new TextMessage("消息"+i);
                session.sendMessage(returnMessage);
                i++;
                Thread.sleep(3000);
            }
    
        }
    
        /**
         * 关闭连接时触发
         */
        public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
            logger.debug("websocket connection closed......");
            String username= (String) session.getAttributes().get("WEBSOCKET_USERNAME");
            System.out.println("用户"+username+"已退出!");
            users.remove(session);
            System.out.println("剩余在线用户"+users.size());
        }
    
        /**
         * js调用websocket.send时候,会调用该方法
         */
        @Override
        protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
            super.handleTextMessage(session, message);
        }
    
        public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
            if(session.isOpen()){session.close();}
            logger.debug("websocket connection closed......");
            users.remove(session);
        }
    
        public boolean supportsPartialMessages() {
            return false;
        }
    
    
        /**
         * 给某个用户发送消息
         *
         * @param userName
         * @param message
         */
        public void sendMessageToUser(String userName, TextMessage message) {
            for (WebSocketSession user : users) {
                if (user.getAttributes().get("WEBSOCKET_USERNAME").equals(userName)) {
                    try {
                        if (user.isOpen()) {
                            user.sendMessage(message);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    break;
                }
            }
        }
    
        /**
         * 给所有在线用户发送消息
         *
         * @param message
         */
        public void sendMessageToUsers(TextMessage message) {
            for (WebSocketSession user : users) {
                try {
                    if (user.isOpen()) {
                        user.sendMessage(message);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
    }

    3.SpringWebSocketHandlerInterceptor

    package com.fz.websocket;
    
    import java.util.Map;
    
    import javax.servlet.http.HttpSession;
    
    import org.springframework.http.server.ServerHttpRequest;
    import org.springframework.http.server.ServerHttpResponse;
    import org.springframework.http.server.ServletServerHttpRequest;
    import org.springframework.web.socket.WebSocketHandler;
    import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
    
    /**
     * WebSocket拦截器
     * @author WANG
     *
     */
    public class SpringWebSocketHandlerInterceptor extends HttpSessionHandshakeInterceptor {
        @Override
        public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
                                       Map<String, Object> attributes) throws Exception {
            // TODO Auto-generated method stub
            System.out.println("Before Handshake");
            if (request instanceof ServletServerHttpRequest) {
                ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
                HttpSession session = servletRequest.getServletRequest().getSession(false);
                if (session != null) {
                    //使用userName区分WebSocketHandler,以便定向发送消息
                    String userName = (String) session.getAttribute("SESSION_USERNAME");
                    if (userName==null) {
                        userName="default-system";
                    }
                    attributes.put("WEBSOCKET_USERNAME",userName);
                }
            }
            return super.beforeHandshake(request, response, wsHandler, attributes);
    
        }
    
        @Override
        public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
                                   Exception ex) {
            // TODO Auto-generated method stub
            super.afterHandshake(request, response, wsHandler, ex);
        }
    }

    三、客户端HTML代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <body>
    <input id="CreateSocket" type="button" value="创建WebSocKet" />
    收到消息<p id="message"></p>
    <input id="Close" type="button" value="关闭WebSocket" />
    </body>
    <script type="text/javascript">
        var websocket = new WebSocket('ws://localhost:8080/websocket');
    
            if ('WebSocket' in window){
                websocket = new WebSocket('ws://localhost:8080/websocket');
            }
            else{
                console.log('该浏览器不支持WebSocket')
            }
        
    
    
        websocket.onopen = function(event) {
            console.log('WebSocket创建成功')
        }
    
        websocket.onclose = function (event) {
            console.log('链接关闭')
        };
        websocket.onmessage = function (event) {
            document.getElementById('message').innerHTML=event.data
            console.log('收到消息'+event.data)
        }
        websocket.onerror=function () {
            alert('websocket通信发生错误')
        }
        websocket.onbeforeunload=function () {
            websocket.close()
        }
    
    
    </script>
    </body>
    </html>
  • 相关阅读:
    函数参数传递
    C# 串口发送 陷阱,必须知道的坑
    Altera Quartus 13.1 仿真工具路径错误问题解决 Can't launch the ModelSim-Altera software
    Altium Designer 快速修改板子形状为Keep-out layer大小
    Altium Designer 敷铜间距设置,真实有效
    VS2012,VS2013启用SQLite的Data Provider界面显示
    Sqlite 设置外键级联更新
    Sqlite 设置默认时间为本地时间
    FPGA学习笔记之Altera FPGA使用JIC文件配置固化教程(转)
    FPGA学习记录
  • 原文地址:https://www.cnblogs.com/theyang/p/13385738.html
Copyright © 2011-2022 走看看