探索Springwindows运维

Spring Websocket使用介绍

2019-12-09  本文已影响0人  Real_man

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上做一些扩展,后续再做说明。

上一篇 下一篇

猜你喜欢

热点阅读