Spring Boot 2.x实战96 – 事件驱动5 – Websocket之Reactive Websocket

  • Post author:
  • Post category:其他

4.2 Reactive Websocket

在这一小节,我们对响应式的Websocket进行简单的演示。

4.2.1 新建应用

新建应用,信息如下:

Group:top.wisely

Artifact:learning-websocket-reactive

Dependencies:Spring Reactive WebLombok

build.gradle文件中的依赖如下:

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-webflux'
	implementation 'javax.websocket:javax.websocket-api' //添加Websocket API
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
  //...
}
4.2.1示例
  • 配置响应式Websocket

    @Configuration
    public class WebsocketConfig {
        @Bean
        public HandlerMapping handlerMapping() {//1
            Map<String, WebSocketHandler> map = new HashMap<>();
            map.put("/hello", new HelloHandler());
    
            SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
            mapping.setUrlMap(map);
            mapping.setOrder(-1); // before annotated controllers
            return mapping;
        }
    
        @Bean
        public HandlerAdapter handlerAdapter() {
            return new WebSocketHandlerAdapter();
        }
    }
    

    和Spring MVC和WebFlux一样处理一样,配置主要有两个类组成:

    1. HandlerMapping:负责地址和处理方法之间的映射;这里使用的是SimpleUrlHandlerMapping,将地址/hello与处理类HelloHandler类对应;
    2. HandlerAdapter:负责实际的方法调用处理;这里使用WebSocketHandlerAdapter,可以让WebSocketHandler的实现类作为处理方法。
  • 处理方法

    public class HelloHandler implements WebSocketHandler {
        @Override
        public Mono<Void> handle(WebSocketSession session) { //1
            return session.send(session.receive()
                    .map(msg -> "Hello:" + msg.getPayloadAsText()) //2
                    .map(session::textMessage)
            );
        }
    }
    
    1. WebSocketSession对象可以使用send方法发送消息也可以使用receive接收消息;
    2. 将客户端传来的消息添加Hello:并发回给客户端。
  • 客户端页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Hello</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        <script src="https://cdn.bootcss.com/stomp.js/2.3.3/stomp.min.js"></script>
    </head>
    <body>
    <div>
        <button onclick="connect()">连接</button>
        <button onclick="disconnect()">关闭</button>
    
    </div>
    <div>
    <input type="text" id="msg"/>
    <button onclick="send()">发送</button>
    </div>
    <div id="response"></div>
    </body>
    <script>
        var ws = null;
        var url = "ws://localhost:8080/hello";
        function connect() {
            ws = new WebSocket(url);
            ws.onopen = function() {
                alert("连接成功")
            };
            ws.onmessage = function(event) { //监听服务端返回
                $("#response").append(event.data + '<br>');
            };
    
            ws.onclose = function(event) {
               alert("关闭成功")
            };
        }
    
        function disconnect() {
                ws.close();
        }
    
        function send() { //发送消息到服务端
            if (ws != null) {
                ws.send($("#msg").val());
            } else {
                alert('连接已关闭,请重连');
            }
        }
    
    </script>
    </html>
    
  • 启动应用

    访问http://localhost:8080/hello.html,点击“连接”成功后,在输入框输入消息:

在这里插入图片描述

新书推荐:

我的新书《从企业级开发到云原生微服务:Spring Boot 实战》已出版,内容涵盖了丰富Spring Boot开发的相关知识
购买地址:https://item.jd.com/12760084.html
在这里插入图片描述

主要包含目录有:

第一章 初识Spring Boot(快速领略Spring Boot的美丽)
第二章 开发必备工具(对常用开发工具进行介绍:包含IntelliJ IDEA、Gradle、Lombok、Docker等)
第三章 函数式编程
第四章 Spring 5.x基础(以Spring 5.2.x为基础)
第五章 深入Spring Boot(以Spring Boot 2.2.x为基础)
第六章 Spring Web MVC
第七章 数据访问(包含Spring Data JPA、Spring Data Elasticsearch和数据缓存)
第八章 安全控制(包含Spring Security和OAuth2)
第九章 响应式编程(包含Project Reactor、Spring WebFlux、Reactive NoSQL、R2DBC、Reactive Spring Security)
第十章 事件驱动(包含JMS、RabbitMQ、Kafka、Websocket、RSocket)
第11章 系统集成和批处理(包含Spring Integration和Spring Batch)
第12章 Spring Cloud与微服务
第13章 Kubernetes与微服务(包含Kubernetes、Helm、Jenkins、Istio)
多谢大家支持。


版权声明:本文为wiselyman原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。