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 2023年5月23日
    00
  • Java中线程池自定义实现详解

    Java中线程池自定义实现详解 什么是线程池 在Java中,每次创建线程都需要为该线程分配独立的资源,包括CPU利用时间、栈内存等,这些资源的分配和回收都需要时间开销。当并发任务数量较大时,频繁地创建线程会导致系统负担过重,极有可能会出现OOM等问题。为了解决这个问题,Java提供了线程池,它可以在系统初始化时创建一定数量的线程,并将这些线程保存在池中,执行…

    Java 2023年5月19日
    00
  • 一文详解Object类和抽象类

    一文详解Object类和抽象类 什么是Object类 在Java中,所有的类都是继承自Object类的。Object类是Java语言中的根类,它是所有类的父类,也就是Java中的类都会隐式继承自Object类。在Object类中,定义了几个常用的方法,如: public String toString(): 返回对象的字符串表示。 public boolea…

    Java 2023年5月26日
    00
  • SpringBoot 使用Mybatis分页插件实现详解

    Spring Boot使用MyBatis分页插件实现详解 在Spring Boot项目中,使用MyBatis作为ORM框架,实现数据的查询、插入、删除、更新等操作。对于一些大数据量的查询场景,需要使用分页查询来避免一次性查询过多数据导致内存溢出的问题。这时,可以使用MyBatis的分页插件来解决这个问题。 1. 添加Maven依赖 在项目的pom.xml文件…

    Java 2023年5月19日
    00
  • JavaScript结合PHP实现网页制作中双下拉菜单的动态实现

    为实现网页中的双下拉菜单,我们需要采用JavaScript结合PHP进行动态实现。具体步骤如下: 第一步:准备HTML和CSS代码 在HTML中定义两个下拉列表框和对应的CSS样式,示例如下: <select id="province" name="province"></select> &lt…

    Java 2023年6月15日
    00
  • java的Hibernate框架报错“InvalidStateException”的原因和解决方法

    当使用Java的Hibernate框架时,可能会遇到“InvalidStateException”错误。这个错误通常是由于以下原因之一引起的: 实体状态错误:如果实体状态错误,则可能会出现此错误。在这种情况下,需要检查实体状态并进行必要的更改。 数据库连接问题:如果数据库连接出现问题,则可能会出现此错误。在这种情况下,需要检查数据库连接并解决连接问题。 以下…

    Java 2023年5月4日
    00
  • Spring中@Async用法详解及简单实例

    当我们需要在Spring应用中增加异步任务支持时,可以使用@Async注解来标示异步方法。@Async注解可以标识在任何方法上面,表示该方法会异步执行。本篇攻略将从以下几个方面介绍Spring中@Async的用法,包括: 开启异步支持 使用@Async注解实现异步方法 使用Future返回异步结果 示例1:异步方法的实现 示例2:带参数的异步方法 开启异步支…

    Java 2023年5月19日
    00
  • JSP之plugin的使用

    当我们在使用JSP开发Web应用时,通常需要和一些第三方的插件或库进行交互。在JSP中,可以通过使用plugin标签来实现这一功能。本文将详细讲解JSP之plugin的使用方法,包括以下内容: plugin标签的基本用法 plugin标签的属性 示例说明 1. plugin标签的基本用法 plugin标签的基本用法如下所示: <jsp:plugin t…

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