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

下面将对“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中URLEncoder.encode与URLDecoder.decode处理url特殊参数的方法

    下面是 Java 中 URLEncode 和 URLDecode 处理 URL 特殊参数的完整攻略。 URLEncode 和 URLDecode 概述 在 URL 中,有一些字符是有特殊意义的,例如问号、等号、百分号等,如果要在 URL 中传递这些特殊字符,需要进行编码和解码操作,否则会导致 URL 出现错误。 URLEncode 操作就是将传入的字符串进行…

    Java 2023年5月20日
    00
  • SpringBoot自定义注解API数据加密和签名校验

    首先我想说明一下本次攻略的目的和背景。随着网络技术的快速发展,很多 web 应用都包含了用户敏感信息,数据的安全性也变得越来越重要。而其中一个解决方案就是加密和签名校验。SpringBoot 作为一个主流的开发框架,提供了各种扩展点,开发人员可以通过自定义注解来实现各种功能,其中就包括 API 数据加密和签名校验。我们的攻略就是基于 SpringBoot 自…

    Java 2023年5月20日
    00
  • Java设置String字符串编码方法详解

    Java设置String字符串编码方法详解 在Java中,字符串编码是非常重要的一个概念,它涉及到字符串在不同系统之间的传输和存储,如果不正确地处理编码会导致乱码或者其他不可预计的问题。本文将详细介绍Java中设置字符串编码的方法,帮助读者更好地掌握这一知识。 字符串编码介绍 在计算机中,一切都是二进制的,因此字符串也需要通过编码方式将其转换为二进制,才能在…

    Java 2023年5月20日
    00
  • Java实现超级实用的日记本

    Java实现超级实用的日记本 介绍 在这份攻略中,我们将详细讲解如何使用Java实现一个超级实用的日记本。这个日记本可以帮助用户记录自己每天的生活、工作情况,同时还可以进行文本的编辑、保存、读取等操作。我们将以Java Swing为界面框架,使用文件io技术将数据保存在本地。 环境 JDK 1.8 或以上 Eclipse IDE 项目结构 我们将创建一个Ja…

    Java 2023年5月18日
    00
  • 利用Spring AOP记录方法的执行时间

    利用Spring AOP记录方法的执行时间可以通过以下步骤实现: 1. 添加依赖 在pom.xml文件中添加Spring AOP的依赖: <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</arti…

    Java 2023年5月20日
    00
  • SpringBoot部署xxl-job方法详细讲解

    SpringBoot部署xxl-job方法详细讲解 1. 简介 xxl-job是一款分布式定时任务调度平台,支持固定间隔、固定时间以及CRON表达式等多种调度方式,同时也支持多线程、任务追踪、报警监控、在线日志等多种实用功能。而SpringBoot作为目前流行的开发框架之一,为xxl-job的部署提供了便利。 本攻略将详细介绍在SpringBoot应用中如何…

    Java 2023年5月19日
    00
  • 把textarea中字符串里含有的回车换行替换成<br>的javascript代码

    将textarea中字符串里含有的回车换行替换成<br>的javascript代码可以通过正则表达式以及字符串操作来实现,具体步骤如下: 第一步:获取textarea中的值 我们可以通过JavaScript来获取textarea中的值,代码示例如下: const textArea = document.querySelector(‘textare…

    Java 2023年6月15日
    00
  • 在jsp页面中响应速度提高的7种方法分享

    “在jsp页面中响应速度提高的7种方法分享”是一篇介绍如何提升jsp页面响应速度的文章。下面我们来逐一讲解这7条方法。 1. 压缩页面 在jsp页面中,压缩页面可以减少文件大小,从而减少传输时间,提高页面加载速度。可以使用GZIP、BZIP等压缩技术进行压缩。在jsp中,可以使用filter过滤器来实现页面压缩。以下是一个示例: public class C…

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