SpringBoot集成WebSocket【基于纯H5】进行点对点[一对一]和广播[一对多]实时推送

yizhihongxing

下面将对“SpringBoot集成WebSocket进行点对点和广播实时推送”的完整攻略进行详细讲解,建议您认真阅读。

  1. 概述

WebSocket是HTML5推出的一种新型协议,它类似于HTTP协议,但对服务器尤其友好。它允许服务器在任何时刻向客户端推送数据,而不必等待客户端去请求。相对于传统的Ajax轮询方式,WebSocket更加高效、实时。

SpringBoot是基于Spring Framework的一个快速开发框架,它把Spring全家桶集成在一起,使得使用Spring开发Web应用变得更加便捷。

在本教程中,我们将讲解如何使用SpringBoot集成WebSocket进行点对点和广播实时推送。

  1. 环境准备

在开始之前,我们需要准备好以下环境:

  • JDK 1.8或以上
  • Maven
  • IntelliJ IDEA或Eclipse

  • 创建SpringBoot项目

首先,我们需要创建一个SpringBoot项目。打开IntelliJ IDEA,选择“Create New Project”,然后选择“Spring Initializr”。

在弹出的窗口中,填写项目的基本信息,如下图所示:

点击“Next”按钮,然后选择要导入的依赖。在本教程中,我们需要选择“WebSocket”和“Thymeleaf”依赖,如下图所示:

点击“Next”和“Finish”按钮,完成项目的创建。

  1. 添加WebSocket配置

在项目中添加WebSocket,需要添加@EnableWebSocket注解,并实现WebSocketConfigurer接口,如下所示:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new MyHandler(), "/myHandler").setAllowedOrigins("*");
    }

    private class MyHandler extends TextWebSocketHandler {
        @Override
        public void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
            session.sendMessage(new TextMessage("Hello, " + message.getPayload() + "!"));
        }
    }

}

在上述代码中,我们创建了一个WebSocket处理程序MyHandler,并将这个处理程序映射到了“/myHandler”路径下。在MyHandler中,我们重写了handleTextMessage方法,在该方法中向客户端发送了一条问候消息。

另外,我们还需要添加一个WebSocket消息代理控制器,它可以把WebSocket消息转发到STOMP消息代理上,代码如下:

@Configuration
public class WebSocketMessageBrokerConfigurer implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic");
        registry.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/stomp").setAllowedOrigins("*").withSockJS();
    }

}

在上述代码中,我们调用registry.enableSimpleBroker("/topic")方法以启用简单的消息代理,并将消息代理目的地设置为“/topic”。我们还调用registry.setApplicationDestinationPrefixes("/app")方法以设置应用程序目的地前缀为“/app”。

另外,我们也注册了一个STOMP端点“/stomp”,并调用withSockJS()方法以启用SockJS。

  1. 添加页面代码

在本教程中,我们将使用Thymeleaf作为页面模板引擎,因此我们需要在项目中添加一个index.html文件,并添加WebSocket客户端代码。

在src/main/resources/templates目录下创建index.html文件,代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>WebSocket Demo</title>
</head>
<body>
<h1>WebSocket Demo</h1>
<input type="text" id="name" placeholder="请输入你的名字"><br/><br/>
<input type="button" value="发送" onclick="sendMessage()"><br/><br/>
<p id="message"></p>

<script src="https://cdn.bootcss.com/sockjs-client/1.1.4/sockjs.min.js"></script>
<script src="https://cdn.bootcss.com/stomp.js/2.3.3/stomp.min.js"></script>
<script>
    var stompClient = null;

    function connect() {
        var socket = new SockJS('/stomp');
        stompClient = Stomp.over(socket);
        stompClient.connect({}, function (frame) {
            console.log('Connected: ' + frame);
            stompClient.subscribe('/topic/greetings', function (message) {
                showMessage(JSON.parse(message.body).content);
            });
        });
    }

    function disconnect() {
        if (stompClient != null) {
            stompClient.disconnect();
        }
        console.log("Disconnected");
    }

    function sendMessage() {
        var name = document.getElementById('name').value;
        stompClient.send("/app/hello", {}, JSON.stringify({'name': name}));
    }

    function showMessage(message) {
        document.getElementById('message').innerHTML = message;
    }

    connect();
</script>
</body>
</html>

在上述代码中,我们使用了SockJS和STOMP.js库来简化WebSocket的使用。在页面打开时,我们调用connect()函数以连接WebSocket。在connect()函数中,我们创建了一个WebSocket连接,并订阅了“/topic/greetings”路径下的消息。在sendMessage()函数中,我们发送了一条消息到“/app/hello”路径下,消息体为一个json字符串。在showMessage()函数中,我们更新了页面上显示的消息。

  1. 示例一:点对点实时推送

在这个示例中,我们将展示如何使用点对点实时推送。为了模拟多个客户端,我们可以同时打开多个浏览器窗口,每个窗口都使用相同的WebSocket连接。

首先,我们需要修改WebSocket处理程序,使其可以接收客户端发送的消息,并将其转发给指定的客户端:

private static Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>();

@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
    sessions.put(session.getId(), session);
}

@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
    sessions.remove(session.getId());
}

@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
    String[] parts = message.getPayload().split(" ");
    String sessionId = parts[0];
    String content = parts[1];
    if (sessions.containsKey(sessionId)) {
        sessions.get(sessionId).sendMessage(new TextMessage(content));
    }
}

在上述代码中,我们使用一个ConcurrentHashMap来存储所有WebSocket会话。我们在afterConnectionEstablished()方法中保存每个会话,然后在afterConnectionClosed()方法中删除它。在handleTextMessage()方法中,我们首先解析从客户端发送过来的消息,得到sessionId和content两个部分,然后在sessions中查找对应的WebSocket会话,完成消息的转发。

接下来,我们需要修改前端客户端代码,以便客户端能够向指定的客户端发送消息:

function sendMessage() {
    var sessionId = document.getElementById('sessionId').value;
    var content = document.getElementById('content').value;
    stompClient.send("/app/message/" + sessionId, {}, sessionId + ' ' + content);
}

在上述代码中,我们使用sessionId来标识指定的WebSocket会话,然后通过“/app/message/${sessionId}”路径发送消息。

最后,我们需要修改页面代码,添加用于输入sessionId和content的文本框,并添加发送按钮,代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>WebSocket Demo</title>
</head>
<body>
<h1>WebSocket Demo</h1>
<label>SessionId:</label><input type="text" id="sessionId" placeholder="请输入接收方WebSocket的SessionId"><br/><br/>
<label>Content:</label><input type="text" id="content" placeholder="请输入要发送的内容"><br/><br/>
<input type="button" value="发送" onclick="sendMessage()"><br/><br/>
<p id="message"></p>

<script src="https://cdn.bootcss.com/sockjs-client/1.1.4/sockjs.min.js"></script>
<script src="https://cdn.bootcss.com/stomp.js/2.3.3/stomp.min.js"></script>
<script>
    var stompClient = null;

    function connect() {
        var socket = new SockJS('/stomp');
        stompClient = Stomp.over(socket);
        stompClient.connect({}, function (frame) {
            console.log('Connected: ' + frame);
            stompClient.subscribe('/user/queue/messages', function (message) {
                showMessage(JSON.parse(message.body).content);
            });
        });
    }

    function disconnect() {
        if (stompClient != null) {
            stompClient.disconnect();
        }
        console.log("Disconnected");
    }

    function sendMessage() {
        var sessionId = document.getElementById('sessionId').value;
        var content = document.getElementById('content').value;
        stompClient.send("/app/message/" + sessionId, {}, sessionId + ' ' + content);
    }

    function showMessage(message) {
        document.getElementById('message').innerHTML = message;
    }

    connect();
</script>
</body>
</html>

重启应用程序,打开多个浏览器窗口,并分别输入不同的sessionId和content,点击发送按钮,可以看到接收方的WebSocket会话可以实时接收到消息。

  1. 示例二:广播实时推送

在这个示例中,我们将展示如何使用广播实时推送。在这个示例中,我们将使用SpringBoot内置的简单消息代理实现广播功能。

首先,我们需要修改WebSocket处理程序,使其可以发布新的消息到消息代理上:

@MessageMapping("/hello")
@SendTo("/topic/greetings")
public String hello(@Payload String name) {
    return "Hello, " + name + "!";
}

在上述代码中,我们使用@MessageMapping("/hello")注解来监听“/app/hello”路径下的消息,并使用@SendTo("/topic/greetings")注解来将消息转发到消息代理上。

接下来,我们需要修改前端客户端代码,以便可以自动接收来自“/topic/greetings”路径下的新消息。修改代码如下:

function connect() {
    var socket = new SockJS('/stomp');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        console.log('Connected: ' + frame);
        stompClient.subscribe('/topic/greetings', function (message) {
            showMessage(JSON.parse(message.body));
        });
    });
}

在上述代码中,我们使用stompClient.subscribe('/topic/greetings')方法来监听“/topic/greetings”路径下的新消息,并将其展示在页面上。

重启应用程序,打开多个浏览器窗口,并输入不同的name,点击发送按钮,可以看到所有窗口都可以接收到广播消息。

到这里,我们就成功地完成了使用SpringBoot集成WebSocket进行点对点和广播实时推送的教程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot集成WebSocket【基于纯H5】进行点对点[一对一]和广播[一对多]实时推送 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java中反射的学习笔记分享

    关于Java中反射的学习笔记分享,下面就详细讲解一下完整攻略。 什么是Java中的反射 Java中的反射机制是指在运行时动态地获取一个类的各种信息的能力。它能够在程序运行时直接操作对象的内部属性,调用对象的方法,它使得原本在编译时就需要确定的类名、方法名等信息可以在运行时通过反射机制动态获取。 Java中反射的使用场景 1.在设计一些通用使用的代码时,比如动…

    Java 2023年5月26日
    00
  • Java终止循环体的具体实现

    Java终止循环体可以使用break和continue两个关键字实现,这两个关键字可以在循环体内使用。 使用break关键字终止循环体 当循环体内部的条件满足某个条件时,可以使用break关键字终止循环体的执行。下面是一个使用break关键字的示例: for (int i = 0; i < 10; i++) { if (i == 5) { break;…

    Java 2023年5月26日
    00
  • 剖析Java中的事件处理与异常处理机制

    剖析Java中的事件处理与异常处理机制 事件处理机制 Java中的事件处理机制是一种将某些动作(例如按钮点击、鼠标移动等)与一些代码相结合的机制。具体来说,Java使用了一种称为“观察者设计模式”的方法来实现事件处理。在这种模式中,一个对象(称为“主题”)维护了一组观察者,这些观察者都希望跟踪主题的状态。当主题状态发生变化时,它将会通知所有的观察者,使得它们…

    Java 2023年5月27日
    00
  • SpringBoot集成整合JWT与Shiro流程详解

    下面是对于“SpringBoot集成整合JWT与Shiro流程详解”的完整攻略。 概述 在传统的Web应用中,我们通常采用用户名和密码进行身份认证,但这种方式很容易受到各种攻击,例如:暴力破解、钓鱼等。为了解决这些问题,我们可以采用JWT的方式进行身份认证,并使用Shiro进行授权管理。本文将详细介绍SpringBoot集成整合JWT与Shiro的流程。 J…

    Java 2023年5月20日
    00
  • java 反射机制详解及实例代码

    Java反射机制详解 Java反射机制是指在运行时使用Reflection API动态获取类信息、构造对象、调用方法、访问属性等。反射机制在框架开发、ORM映射、动态代理、JavaBean工具、JUnit单元测试等领域有着广泛的应用。 反射机制的特性 Java反射机制具有以下特性: 运行时类型信息:反射机制可以获取类的各种信息,例如类名、父类、接口、方法、属…

    Java 2023年5月23日
    00
  • springboot+jwt+springSecurity微信小程序授权登录问题

    背景介绍 在微信小程序中实现授权登录是一个常见的需求,一般情况下我们可以通过使用微信提供的API实现相关功能。然而,在某些需要更加丰富的业务场景下,如需要融合第三方登录、访问权限控制以及身份验证等功能时,就需要我们使用 SpringBoot+JWT+Spring Security 来实现这些需求。 Spring Security 采用基于过滤器链的结构,通过…

    Java 2023年5月20日
    00
  • Spring Data Jpa 中原生查询 REGEXP 的使用详解

    下面是关于“Spring Data Jpa 中原生查询 REGEXP 的使用详解”的完整攻略。 什么是 Spring Data Jpa Spring Data Jpa 是 Spring Data 家族中的一员,它简化了对关系型数据库的访问,使得开发人员可以更方便地使用 JPA 来访问数据库。相比于原生 JPA,Spring Data Jpa 提供了更高层次的…

    Java 2023年6月3日
    00
  • 带你快速搞定java数组

    带你快速搞定Java数组 Java数组是一种常用的数据结构,它允许存储一组相同类型的数据。本文将向您介绍如何使用Java数组。 创建数组 在Java中,使用以下语法创建一个数组: <数据类型>[] <数组名称> = new <数据类型>[<数组长度>]; 其中, <数据类型>是要存储在数组中的数据类…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部