zoukankan      html  css  js  c++  java
  • spring boot 下websocket实现的两种方法

    websocket前台实现代码,保存为html执行就好

    html代码来自:https://blog.csdn.net/M348915654/article/details/53616837

    <html>
        <head>
            <meta charset="utf-8">
            <title>WebSoket Demo</title>
            <script type="text/JavaScript">
                // tips: WebSocket 调试脚本
                var WebSocket = WebSocket || window.WebSocket || window.MozWebSocket;
                // 验证浏览器是否支持WebSocket协议
                if (!WebSocket) {
                    alert("WebSocket not supported by this browser!");
                }
                else {
                    var g_ws = null;
     
                    function Display() {
                        // 载入上次记录的数据 //...
                        console.log("websocket 测试");
                    }
     
                    var log = function (s) {
                        if (document.readyState !== "complete") {
                            log.buffer.push(s);
                        } else {
                            document.getElementById("contentId").value = (s + "
    ") + document.getElementById("contentId").value
                        }
                    }
     
                    function CreateConnect () {
                        var msg = document.getElementById("wsUrlId");
                        console.log("CreateConnect(), url: " + msg.value);
                        if (g_ws == null) {
                            var wsUrlValue = msg.value;
     
                            try {
                                g_ws = new WebSocket(wsUrlValue);
                                // 监听消息
                                g_ws.onmessage = function (event) {
                                    //valueLabel.innerHTML+ = event.data;
                                    log("onmessage(), 接收到服务器消息: " + event.data);
                                };
                                // 打开 WebSocket
                                g_ws.onclose = function (event) {
                                    //WebSocket Status:: Socket Closed
                                    log("onclose(), Socket 已关闭!");
                                    g_ws = null;
                                };
                                // 打开WebSocket
                                g_ws.onopen = function (event) {
                                    //WebSocket Status:: Socket Open
                                    // 发送一个初始化消息
    //                            g_ws.send("Hello, Server!");
                                    log("onopen(), Socket 连接成功!");
                                };
                                g_ws.onerror = function (event) {
                                    //WebSocket Status:: Error was reported
                                    log("onerror(), Socket 发生错误!");
                                };
                            }
                            catch (e) {
                                g_ws = null;
                                log("连接异常, 重置 websocket");
                            }
                        }
                    }
                    
                    function SendMsg() {
                        var msg = document.getElementById("messageId");
                        console.log("SendMsg(), msg: " + msg.value);
                        if (g_ws != null) {
                            //alert(msg.value);
                            log("发送 Socket 消息: " + msg.value);
                            g_ws.send(msg.value);
                        }
                        else {
                            log("Socket 还未创建!, msg: " + msg.value);
                        }
                    }
     
                    function CloseConnect () {
                        console.log("CloseConnect()");
                        if (g_ws != null) {
                            g_ws.close();
                        }
                    }
                }
            </script>
        </head>
     
        <body onload="Display()">
            <div id="valueLabel"></div>
            <textarea rows="20" cols="30" id="contentId"></textarea>
            <br/>
            <input name="wsUrl" id="wsUrlId" value="ws://localhost:8888/websocket"/>
            <button id="createButton" onClick="javascript:CreateConnect()">Create</button>
            <button id="closeButton" onClick="javascript:CloseConnect()">Close</button>
            <br/>
            <input name="message" id="messageId" value="Hello, Server!"/>
            <button id="sendButton" onClick="javascript:SendMsg()">Send</button>
        </body>
    </html>

    方法一

    配置:

    /**
     * webSocket 方法一
     */
    @Configuration
    @ConditionalOnWebApplication
    public class WebSocketConfig  {
        @Bean
        public ServerEndpointExporter serverEndpointExporter() {
            return new ServerEndpointExporter();
        }
    }

    实现:

    /**
     * webSocket 方法一
     */
    @Slf4j
    @ServerEndpoint(value = "/websocket")
    @Component
    public class WebSocketServer {
        /**
         * 连接建立成功调用的方法
         */
        @OnOpen
        public void onOpen(Session session) {
          
        }
    
        /**
         * 连接关闭调用的方法
         */
        @OnClose
        public void onClose() {
            webSocketSet.remove(this);  //从set中删除
           
        }
    
        /**
         * 收到客户端消息后调用的方法
         *
         * @param message 客户端发送过来的消息
         */
        @OnMessage
        public void onMessage(String message, Session session) {
           
        }
    
        /**
         * @param session
         * @param error
         */
        @OnError
        public void onError(Session session, Throwable error) {
         
        }
    }

    方法二:

    配置

    /**
     * webSocket方法二
     * @author tongxiabin
     */
    @Component
    @EnableWebMvc
    @EnableWebSocket
    public class WebSocketConfig2  implements WebSocketConfigurer {
    
        @Resource
        private MyWebSocketHandler handler;
    
        @Override
        public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
            registry.addHandler(handler, "/wsMy").addInterceptors(new HandshakeInterceptor() {
                @Override
                public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {
                    System.out.println("registerWebSocketHandlers-beforeHandshake");
                    serverHttpResponse.setStatusCode(HttpStatus.OK);
                    return true;
                }
    
                @Override
                public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) {
                    System.out.println("registerWebSocketHandlers-afterHandshake");
                }
            }).setAllowedOrigins("*");
        }
    }

    实现:

    /**
     * webSocket 方法二
     */
    @Component
    public class MyWebSocketHandler implements WebSocketHandler {
    
        private static final Map<String ,WebSocketSession> userMap=new HashMap<>();
        @Override
        public void afterConnectionEstablished(WebSocketSession webSocketSession) throws Exception {
           String jspCode = (String )webSocketSession.getAttributes().get("jspCode");
    
            if(userMap.get(jspCode)==null){
                System.out.println(jspCode);
                userMap.put(jspCode,webSocketSession);
            }
        }
    
        @Override
        public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception {
            System.out.println("handleMessage");
        }
    
        @Override
        public void handleTransportError(WebSocketSession webSocketSession, Throwable throwable) throws Exception {
            System.out.println("handleTransportError");
        }
    
        @Override
        public void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception {
            System.out.println("afterConnectionClosed");
        }
    
        @Override
        public boolean supportsPartialMessages() {
            return false;
        }
    }
  • 相关阅读:
    【如何入门ACM】
    HDU
    HDU 6107 Typesetting
    bzoj 3223: Tyvj 1729 文艺平衡树
    51Nod 1781 跑的比谁都快
    51Nod 1331 狭窄的通道
    51Nod 1555 布丁怪
    hihocoder 1035 : 自驾旅行 III
    51Nod 1196 字符串的数量
    51Nod 1530 稳定方块
  • 原文地址:https://www.cnblogs.com/lobin/p/10567424.html
Copyright © 2011-2022 走看看