美文网首页探索Springwindows运维
Spring Websocket使用介绍

Spring Websocket使用介绍

作者: Real_man | 来源:发表于2019-12-09 07:44 被阅读0次

    Websocket协议是一种标准的在单个Tcp连接时,客户端与服务端的全双工通信协议,它运行在Http之上。

    介绍

    在使用Websocket协议时,首先会以Http请求开始,但是请求头中带上Upgrade的请求头,来切换接下来的协议。

    1 客户端请求

    GET /localhost/websocket HTTP/1.1
    Host: localhost
    **Upgrade: websocket**
    **Connection: Upgrade** 
    Origin: http://localhost
    

    2 服务端响应

    HTTP/1.1 **101 Switching Protocols**
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=
    Sec-WebSocket-Protocol: v10.stomp
    
    image-20191209072134278

    在成功的握手之后,Tcp的socket会保持打开状态,以便客户端与服务端接下来继续发送和接消息。

    关于Websocket的完整说明可以参考RFC6455

    Spring Websocket使用

    Spring框架提供了Websocket的API方便我们快速的开发灵活的Websocket应用。

    1 创建Spring Boot应用,引入依赖,spring-boot-starter-websocket默认会引入web-starter。

           <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-websocket</artifactId>
            </dependency>
    

    2 启用Websocket,在指定的地址上配置Websocket的Handler。

    @Configuration
    @EnableWebSocket
    public class WebSocketConfig implements WebSocketConfigurer {
        Logger log = LoggerFactory.getLogger(getClass());
    
        @Override
        public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
            webSocketHandlerRegistry
                    .addHandler(new TextWebSocketHandler(){
                        @Override
                        public void afterConnectionEstablished(WebSocketSession session) throws Exception {
                            log.info("建立连接 {}",session.getId());
                            super.afterConnectionEstablished(session);
                        }
    
                        @Override
                        protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
                            super.handleTextMessage(session, message);
                            log.info("处理收到的数据:{}",new String(message.asBytes()));
                        }
                    }, "/websocket-spring")
                    .setAllowedOrigins("*")
            ;
        }
    }
    

    3 在浏览器中测试。Websocket是否正常工作。

    http://www.websocket-test.com/

    4 写Websocket-client通过编程方式测试Websocket客户端。

    // 仅仅为了测试Websocket Client能否工作。
     @Test
        public void testWebsocketServer() throws InterruptedException {
            StandardWebSocketClient webSocketClient = new StandardWebSocketClient();
    
            WebSocketConnectionManager socketConnectionManager = new WebSocketConnectionManager(webSocketClient,
                    new TextWebSocketHandler() {
                        @Override
                        public void afterConnectionEstablished(WebSocketSession session) throws Exception {
                            super.afterConnectionEstablished(session);
                            System.out.println("已建立连接.");
                            new ReportTimeThread(session).start();
    
                        }
                    },
                    "ws://127.0.0.1:8080/websocket-spring");
    
            socketConnectionManager.start();
    
            Thread.sleep(10000);
        }
    
        private static class ReportTimeThread extends Thread {
            private final WebSocketSession session;
    
            public ReportTimeThread(WebSocketSession session) {
                this.session = session;
            }
    
            @Override
            public void run() {
                try {
                    while (true){
                        session.sendMessage(new TextMessage("当前时间:" + new Date().toString()));
                        Thread.sleep(1000);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
    image-20191209074106234

    最后

    关于Websocket的使用就介绍到这里,可以看出Spring还是提供了很方便的工具来帮助我们快速开发Websocket应用的。

    像关于Websocket的子协议,SockJs,STOMP协议,在Websocket上做一些扩展,后续再做说明。

    相关文章

      网友评论

        本文标题:Spring Websocket使用介绍

        本文链接:https://www.haomeiwen.com/subject/ggovgctx.html