SpringBoot整合WebSocket实现后端向前端发送消息的实例代码

yizhihongxing

下面是“SpringBoot整合WebSocket实现后端向前端发送消息的实例代码”的完整攻略:

1. 引入相关依赖

首先,我们需要在SpringBoot的项目中引入以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

2. 配置WebSocket

在SpringBoot的配置文件中,加入以下配置:

# 配置WebSocket
server.endpoint.prefix=/server
spring.mvc.websocket.path=/websocket

其中,server.endpoint.prefix表示WebSocket的服务前缀,一般为/serverspring.mvc.websocket.path表示WebSocket的请求路径,一般为/websocket

3. 编写WebSocket处理器

接下来,我们需要编写WebSocket的处理器。首先创建一个类,命名为MyHandler,并实现WebSocketHandler接口。在该类中,我们需要重写afterConnectionEstablishedhandleTextMessageafterConnectionClosed等方法:

@Component
public class MyHandler implements WebSocketHandler {

    private static final List<WebSocketSession> SESSIONS = new ArrayList<>();

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        SESSIONS.add(session);
        System.out.println("连接建立:" + session.getId());
    }

    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        String payload = message.getPayload();
        for (WebSocketSession webSocketSession : SESSIONS) {
            if (webSocketSession.isOpen()) {
                webSocketSession.sendMessage(new TextMessage(payload));
            }
        }
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
        SESSIONS.remove(session);
        System.out.println("连接关闭:" + session.getId());
    }

    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        if (session.isOpen()) {
            session.close();
        }
        SESSIONS.remove(session);
    }

    @Override
    public boolean supportsPartialMessages() {
        return false;
    }

}

在以上代码中,我们定义了一个SESSIONS列表,用于保存所有连接的WebSocketSession实例。在afterConnectionEstablished方法中,我们将当前连接的WebSocketSession对象添加到列表中,并打印连接建立的信息。在handleTextMessage方法中,我们遍历所有连接的WebSocketSession对象,将收到的消息发送给所有客户端。在afterConnectionClosed方法中,我们将关闭的WebSocketSession对象从列表中移除,并打印连接关闭的信息。在handleTransportError方法中,如果连接出现异常,我们需要将其关闭,并从列表中移除。最后,在supportsPartialMessages方法中返回false表示不支持分段传输消息。

4. 配置WebSocket拦截器

接着,在SpringBoot的配置类中,添加WebSocket的拦截器:

@Configuration
public class WebSocketConfig implements WebSocketConfigurer {

    @Autowired
    private MyHandler myHandler;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(myHandler, "/websocket").addInterceptors(new HandshakeInterceptor() {
            @Override
            public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler webSocketHandler, Map<String, Object> attributes) throws Exception {
                System.out.println("握手前:" + request.getURI());
                return true;
            }

            @Override
            public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler webSocketHandler, Exception e) {
                System.out.println("握手后:" + request.getURI());
            }
        });
    }

}

在以上代码中,我们首先自动注入MyHandler处理器,然后在registerWebSocketHandlers方法中,对WebSocket的请求路径和处理器进行了注册,并添加了一个握手拦截器,用于在握手前和握手后做一些相关操作。

5. 前端页面

最后,我们需要编写前端页面来测试WebSocket的功能。在页面中,我们需要定义一个WebSocket对象,然后通过该对象与WebSocket服务器建立连接,并监听服务器发送的消息:

var socket;
if (!window.WebSocket) {
    console.log("浏览器不支持WebSocket");
} else {
    socket = new WebSocket("ws://localhost:8080/server/websocket");
    socket.onopen = function () {
        console.log("连接成功");
    };
    socket.onmessage = function (event) {
        console.log("收到消息:" + event.data);
    };
    socket.onclose = function () {
        console.log("连接关闭");
    };
    socket.onerror = function () {
        console.log("连接异常");
    };
}

在以上代码中,我们首先判断浏览器是否支持WebSocket,然后使用new WebSocket()函数创建一个WebSocket对象,指定连接的服务端地址为ws://localhost:8080/server/websocket,其中/server表示WebSocket的服务前缀,/websocket表示WebSocket的请求路径。接着,我们通过WebSocket对象的onopenonmessageoncloseonerror属性对WebSocket的相关事件进行监听和处理。

示例说明

示例一:发送消息

我们可以在前端页面的控制台中输入以下代码,向WebSocket服务器发送消息:

socket.send("Hello, WebSocket");

后端控制台会输出以下信息:

连接建立:ddc9ee55-14e8-1d26-3564-ae8b8667efc7
收到消息:Hello, WebSocket

前端控制台会输出以下信息:

连接成功

示例二:断开连接

我们也可以在前端页面的控制台中输入以下代码,手动断开WebSocket连接:

socket.close();

后端控制台会输出以下信息:

连接关闭:ddc9ee55-14e8-1d26-3564-ae8b8667efc7

前端控制台会输出以下信息:

连接关闭

这就是整合SpringBoot与WebSocket实现后端向前端发送消息的完整攻略,包括依赖引入、WebSocket配置、WebSocket处理器编写、WebSocket拦截器和前端页面示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot整合WebSocket实现后端向前端发送消息的实例代码 - Python技术站

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

相关文章

  • 正值表达式匹配html标签的属性值

    正则表达式是一种强大的匹配字符串的工具,可以用来匹配包括HTML标签属性值在内的多种文本格式。通过正则表达式的学习,我们可以更方便地完成HTML编程和文本处理任务。下面介绍一下如何使用正则表达式匹配HTML标签的属性值。 编写正则表达式 HTML标签的属性值是由引号包裹的文本字符串,因此需要使用正则表达式匹配引号包裹的字符串。我们可以编写一个正则表达式,通过…

    html 2023年5月30日
    00
  • 塞尔达传说王国之泪罗兹马姆宝箱在哪 罗兹马姆神庙宝箱获得方法

    以下是“塞尔达传说王国之泪罗兹马姆宝箱在哪 罗兹马姆神庙宝箱获得方法”的完整攻略: 塞尔达传说王国之泪罗兹马姆宝箱在哪 罗兹马姆神庙宝箱获得方法 塞尔达传说王国之泪是一款非常受欢迎的游戏,其中有一个叫做罗兹马姆神庙的地方,里面有一个宝箱,很多玩家都想知道它在哪里以及如何获得。以下是关于塞尔达传说王国之泪罗兹马姆宝箱在哪以及获得方法的详细攻略。 罗兹马姆宝箱在…

    html 2023年5月18日
    00
  • myeclipse2014导入web项目后页面中文显示乱码怎么办?

    首先,需要了解乱码的原因是因为编码格式不一致,导致页面无法正确识别中文字符。解决方法是在页面中设置正确的编码格式。 以下是解决“myeclipse2014导入web项目后页面中文显示乱码”的详细攻略: 1. 确认编码格式 首先我们需要确认导入的web项目使用的编码格式是什么。一般情况下,UTF-8是常用的编码格式,我们需要设置页面的编码格式为UTF-8。 在…

    html 2023年5月31日
    00
  • 详解XML编程中的模式定义XSD

    XML(Extensible Markup Language)是一种标记语言,它是用于描述数据的格式和元素之间的关系的。 在进行XML编程的过程中,往往需要使用XSD(XML Schema Definition)定义数据格式和数据之间的关系。本文将深入解释XSD的相关概念,详细讲解如何使用模式定义XSD,并提供相关示例。 1. XSD的相关概念 在理解如何使…

    html 2023年5月30日
    00
  • Airpods Pro怎么样 AirPods Pro价格是多少

    以下是关于AirPods Pro的详细攻略: AirPods Pro是什么? AirPods Pro是苹果公司推出的一款无线耳机,于2019年10月发布。AirPods Pro采用了主动降噪技术和透明模式,可以提供更好的音频体验和更好的环境感知。 AirPods Pro的价格是多少? AirPods Pro的价格因地区和销售渠道而异。在美国,AirPods …

    html 2023年5月17日
    00
  • jsp SmartUpload 中文乱码问题解决

    请看下面的详细讲解: JSP SmartUpload 中文乱码问题解决 背景 在使用JSP SmartUpload进行文件上传时,经常会碰到一些中文乱码的问题。这是由于SmartUpload默认的编码方式与我们的页面编码方式不同所导致的。为了解决这个问题,我们需要针对SmartUpload的默认编码方式进行修改。 解决步骤 以下是详细的解决步骤:1. 打开S…

    html 2023年5月31日
    00
  • Visual Studio IDE 实用小技巧(附打包下载)

    Visual Studio IDE 实用小技巧攻略 Visual Studio IDE 是微软公司针对 Windows 开发的一款集成开发环境,提供了多种语言的开发工具和丰富的插件扩展,可满足各种开发需求。本文将针对 Visual Studio IDE 的实用小技巧,为您详细讲解其使用方法。 1. 快速查找定义 在 Visual Studio IDE 中,快…

    html 2023年5月30日
    00
  • XML中的属性学习教程

    下面就XML中的属性学习教程进行详细讲解: 什么是XML的属性 XML属性是描述XML元素的传递数据之间关系的一种方式,属性一般定义在与元素同级别的节点中。属性通常用于为一个元素提供更多的描述信息,一般描述元素的名称、值、状态、操作等信息。 XML属性的语法格式 XML属性一般放置在元素的开始标签中,它的格式如下所示: <element attribu…

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