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中的数组基础知识学习教程

    Java中的数组基础知识学习教程 什么是数组 数组是一种可以存储多个同类型元素的容器。在Java中,数组分为一维数组和多维数组。一维数组可以看作是含有一行元素的表格,多维数组则可以看作是含有多行多列的表格。 如何声明数组 Java中声明数组需要指定数组类型、数组名和数组长度。声明语法如下: 数组类型[] 数组名 = new 数组类型[数组长度]; 比如声明一…

    Java 2023年5月26日
    00
  • 详解Springboot分布式限流实践

    详解 Spring Boot 分布式限流实践 简介 随着互联网的快速发展,面对海量的请求,如何保证系统的稳定性和可用性就成为了分布式系统中必须解决的问题之一。限流是一种应对高并发场景的有效手段,只有控制请求流量,才能避免系统的崩溃或服务的瘫痪。本篇文章将详细讲解如何在 Spring Boot 中实现分布式限流。 限流方式 常见的限流方式包括漏桶算法、令牌桶算…

    Java 2023年5月19日
    00
  • 关于Java变量的声明、内存分配及初始化详解

    关于Java变量的声明、内存分配及初始化详解 变量的声明 在Java中,要使用一个变量之前,必须先对其进行声明。变量的声明包括变量类型和变量名。在声明变量时,可以同时对变量进行初始化(赋初值),也可以在后面的步骤中对变量进行赋值。 变量的声明语法格式如下: 变量类型 变量名; 在声明多个同类型的变量时可以使用逗号进行分隔: 变量类型 变量1, 变量2, ..…

    Java 2023年5月26日
    00
  • 在编码时如何使用\r与\n,两者的区别

    使用\r和\n这两个字符在编码时很重要,它们实际上都是控制字符,用于控制以何种方式显示文本。但是,它们之间存在着明显的区别。下面将详细讲解它们的使用方法和区别。 什么是\r和\n? 首先,\r和\n都是控制字符,用于控制文本在屏幕上的显示方式。其中,\r表示“回车”,用于将光标返回到当前行的开头,而\n则表示“换行”,用于将光标移动到下一行的开头。 在Uni…

    Java 2023年5月20日
    00
  • 关于Java类的构造方法详解

    关于Java类的构造方法详解 类是Java的基本元素,而构造方法则是在创建类的实例时执行的一种特殊方法。本文将详细介绍Java类构造方法的相关知识以及使用技巧。 构造方法的定义 构造方法是一种特殊的方法,它的目的是在创建类的实例时执行一些初始化操作。一般情况下,构造方法和类的名称相同,不过它们没有返回值类型。在创建类的实例时,编译器会自动选择相应的构造方法并…

    Java 2023年5月26日
    00
  • jsp分页显示完整实例

    下面就来详细讲解一下“jsp分页显示完整实例”的攻略。 什么是分页显示? 分页显示是指将大量数据分开展示,并通过页面的控件使用户可以翻页操作,进行查看。 为什么需要分页显示? 如果展示的数据量过大,会导致页面加载速度变慢,甚至使页面崩溃。另外,用户在查看数据时,如果没有分页功能,会使得他们无法方便地找到所需数据。 实现分页显示的方法 实现分页显示有多种方法,…

    Java 2023年6月15日
    00
  • Java利用jenkins做项目的自动化部署

    下面是关于“Java利用Jenkins做项目的自动化部署”的完整攻略: 简介 Jenkins是一个开源的自动化部署工具,用于构建、测试、发布软件项目。Java开发人员可以使用Jenkins实现自己的自动化部署。Java利用Jenkins做项目的自动化部署,主要分为两个步骤: 安装Jenkins 配置Jenkins、部署项目 接下来将针对这两个方面分别详细介绍…

    Java 2023年5月19日
    00
  • Java Socket实现聊天室附1500行源代码

    Java Socket实现聊天室是一种常见的网络应用程序,该应用程序使用Socket API实现了客户端和服务器端之间的连接。本攻略通过讲解如何使用Java Socket API实现一个聊天室,来帮助开发者了解Java Socket编程的基本原理和用法。 概述 Java Socket API是Java语言提供的一个用于网络通信的API,它允许程序员使用Soc…

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