Spring Boot 中的 WebSocket 是什么,原理,如何使用

news2024/12/27 12:20:23

Spring Boot 中的 WebSocket 是什么,原理,如何使用

前言

WebSocket 是一种支持双向通信的网络协议,可以让客户端和服务器之间实现实时通信。Spring Boot 提供了对 WebSocket 的支持,可以方便地在应用程序中实现实时通信功能。本文将介绍 Spring Boot 中的 WebSocket 是什么,其原理和如何使用。

在这里插入图片描述

什么是 WebSocket

WebSocket 是一种支持双向通信的网络协议,它允许客户端和服务器之间建立持久连接,并通过该连接实现实时通信。与 HTTP 不同,WebSocket 允许服务器主动向客户端发送消息,而不需要客户端发送请求。

WebSocket 通信过程如下:

  1. 客户端发送 WebSocket 握手请求到服务器。
  2. 服务器响应 WebSocket 握手请求,并建立 WebSocket 连接。
  3. 客户端和服务器之间通过 WebSocket 连接进行实时通信。

WebSocket 可以用于实现实时聊天、实时数据推送等功能。

Spring Boot 中的 WebSocket

Spring Boot 提供了对 WebSocket 的支持,可以方便地在应用程序中实现实时通信功能。Spring Boot 中的 WebSocket 依赖于 Spring WebFlux 模块,使用了 Reactor Netty 库来实现底层的 WebSocket 通信。

Spring Boot 中的 WebSocket 使用 @Controller 和 @MessageMapping 注解来处理 WebSocket 请求。@Controller 注解用于标识一个类为控制器,而 @MessageMapping 注解用于指定 WebSocket 请求的映射路径。

如何使用 Spring Boot 中的 WebSocket

在 Spring Boot 应用程序中,我们可以使用 @Controller 和 @MessageMapping 注解来创建 WebSocket 控制器。以下是一个简单的示例:

@Controller
public class WebSocketController {
    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public Greeting greeting(HelloMessage message) throws Exception {
        Thread.sleep(1000); // 模拟处理时间
        return new Greeting("Hello, " + message.getName() + "!");
    }
}

在上面的示例中,我们使用 @Controller 注解将 WebSocketController 类标记为控制器。我们使用 @MessageMapping 注解将 WebSocket 请求的映射路径设置为 /hello,并使用 @SendTo 注解将响应消息发送到 /topic/greetings。在 greeting 方法中,我们模拟处理时间并返回一个 Greeting 对象。

客户端的连接

在 Spring Boot 应用程序中,我们可以使用 WebSocketClient 来建立 WebSocket 连接。以下是一个示例:

WebSocketClient client = new ReactorNettyWebSocketClient();
client.execute("ws://localhost:8080/hello", session -> {
    session.send(new TextMessage("{\"name\":\"World\"}"));
    session.receive()
        .map(WebSocketMessage::getPayloadAsText)
        .doOnNext(System.out::println)
        .block();
    return Mono.empty();
}).block();

在上面的示例中,我们使用 ReactorNettyWebSocketClient 创建 WebSocketClient 对象,并使用 execute 方法建立 WebSocket 连接。我们将 WebSocket 请求的 URL 设置为 ws://localhost:8080/hello,并使用 send 方法发送一个 JSON 格式的消息。我们使用 receive 方法接收响应消息,并打印到控制台。

服务器端的配置

在 Spring Boot 应用程序中,我们需要配置 WebSocket 服务器。以下是一个示例:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new WebSocketHandler(), "/hello").setAllowedOrigins("*");
    }
}

在上面的示例中,我们使用 @Configuration 注解将 WebSocketConfig 类标记为配置类。我们使用 @EnableWebSocket 注解启用 WebSocket 支持。在 registerWebSocketHandlers 方法中,我们使用 WebSocketHandlerRegistry 注册一个 WebSocket 控制器,并将其映射到 /hello 路径。我们使用 setAllowedOrigins 方法允许来自任何来源的跨域请求。

总结

在本文中,我们介绍了 Spring Boot 中的 WebSocket 是什么,其原理和如何使用。WebSocket 是一种支持双向通信的网络协议,可以让客户端和服务器之间实现实时通信。Spring Boot 提供了对 WebSocket 的支持,使用了 Reactor Netty 库来实现底层的 WebSocket 通信。

在 Spring Boot 应用程序中,我们可以使用 @Controller 和 @MessageMapping 注解来创建 WebSocket 控制器。我们还可以使用 WebSocketClient 来建立 WebSocket 连接。在服务器端的配置中,我们需要使用 @Configuration 和 @EnableWebSocket 注解来配置 WebSocket 服务器,并使用 WebSocketHandlerRegistry 注册 WebSocket 控制器。

WebSocket 可以用于实现实时聊天、实时数据推送等功能。在实际应用中,我们需要根据业务需求来设计和实现 WebSocket 功能。同时,我们还需要注意 WebSocket 的安全性和性能问题,以确保应用程序的稳定性和安全性。

希望本文能帮助读者了解 Spring Boot 中的 WebSocket,以及如何在应用程序中使用 WebSocket 实现实时通信功能。以下是完整的示例代码:

@Controller
public class WebSocketController {
    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public Greeting greeting(HelloMessage message) throws Exception {
        Thread.sleep(1000); // 模拟处理时间
        return new Greeting("Hello, " + message.getName() + "!");
    }
}

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new WebSocketHandler(), "/hello").setAllowedOrigins("*");
    }
}

public class WebSocketHandler extends TextWebSocketHandler {
    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        // 处理文本消息
    }
}

WebSocketClient client = new ReactorNettyWebSocketClient();
client.execute("ws://localhost:8080/hello", session -> {
    session.send(new TextMessage("{\"name\":\"World\"}"));
    session.receive()
        .map(WebSocketMessage::getPayloadAsText)
        .doOnNext(System.out::println)
        .block();
    return Mono.empty();
}).block();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/701985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers

LangChain是一个基于大语言模型(如ChatGPT)用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互&#x…

iOS App的上架和版本更新流程

一、前言: 作为一名iOSDeveloper,把开发出来的App上传到App Store是必要的。下面就来详细讲解一下具体流程步骤。 二、准备: 一个已付费的开发者账号(账号类型分为个人(Individual)、公司(Com…

2023上半年软考系统分析师科目一整理-17

2023上半年软考系统分析师科目一整理-17 计算机系统的性能一般包括两个大的方面。一个方面是它的(),也就是计算机系统能正常工作的时间,其指标可以是能够持续工作的时间长度,也可以是在一段时间内,能正常工…

【域名详解】网络杂谈(13)之深入简出了解什么是域名

涉及知识点 什么是域名,域名的概念,域名的结构,域名地址的寻址过程,深入了解域名的寻址机制。 原创于:CSDN博主-《拄杖盲学轻声码》,更多内容可去其主页关注下哈,不胜感激 文章目录 涉及知识点…

【工作记录】基于CSS+JS可拖拽改变大小、可吸附到边界的DIV

记录一段实现可拖拽、可自动吸附到边界的代码。 <!DOCTYPE html> <html lang"en"> <head><style>body {overflow: hidden;}#pane {position: absolute;width: 45%;height: 45%;top: 20%;left: 20%;margin: 0;padding: 0;z-index: 99;border…

青岛大学_王卓老师【数据结构与算法】Week03_07_线性表的链式表示和实现7_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c;另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础–…

【Java项目】拉取公司GitLab项目的教程

文章目录 创建Git账号登录Git 创建Git账号 进入公司后&#xff0c;会拿到公司给你注册的邮箱以及密码&#xff0c;你得到用户名和密码之后&#xff0c;需要先创建一个拉取这个仓库对应的git账号。 我们先登录GitLab 当你登录GitLab之后&#xff0c;会显示你还没有ssh key&…

基于matlab使用基本形态运算符和 blob分析的组合从视频流中提取信息(附源码)

一、前言 此示例演示如何使用基本形态运算符和 blob 分析的组合从视频流中提取信息。在本例中&#xff0c;该示例计算每个视频帧中大肠杆菌的数量。请注意&#xff0c;细胞的亮度各不相同&#xff0c;这使得分割任务更具挑战性。 形态运算符是一种图像处理中常用的操作&#…

Linux系统部署BBR服务器加速软件

1. BBR加速软件介绍 BBR简介&#xff1a;   BBR是谷歌的黑科技&#xff0c;也可以理解为用来加速网络的软件&#xff0c;如果服务器在海外&#xff0c;会发现丢包率很高&#xff0c;线路还会时断时续。所以&#xff0c;不用点黑科技&#xff0c;肯定是没办法使用。而BBR加速能…

团体程序设计天梯赛-练习集L2篇⑨

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

Redis 安装配置 常用命令

---------------------- 关系数据库与非关系型数据库 ---------------------------------------- ●关系型数据库&#xff1a; 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记录。 SQL 语句&…

Tomcat的安装部署

tomcat安装部署 tomcat安装部署 一、概述&#xff1a;1.tomcat介绍&#xff1a;2.tomcat核心组件&#xff1a;3.tomcat处理内部请求&#xff08;数据流向图&#xff09;4.tomcat服务部署&#xff1a; 二、虚拟主机配置&#xff1a;1.创建 chan 和 baek 项目目录和文件&#xf…

【C语言初阶(5)】循环练习题

文章目录 1. 计算 n 的阶乘2. 计算 1!2!3!……10!3. 使用二分查找法查找某数二分查找算法介绍代码实现 4. 演示字符移动5. 模拟用户登录场景 1. 计算 n 的阶乘 阶乘 某个数从 1 开始一直乘到这个数本身为止&#xff1b; 例如&#xff1a;3 的阶乘就是 1 * 2 * 3 6&#xff1b…

利用SpringBoot整合mybatis

代码地址&#xff1a;https://gitee.com/jkangle/springboot-exercise.git 1.构建SpringBoot项目 注意版本不能太高版本太高会出现问题整体的项目结构如图 2.导入Mybatis依赖 <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><dependency>&l…

vim 对js文件和txt的操作不同

vim 对js文件和txt的操作不同 https://www.runoob.com/w3cnote/ascii.html 同样一段话&#xff0c;vim 123.txt 和 vim 123.js &#xff0c;将下面这些内容复制&#xff0c;然后粘贴&#xff0c; 显示的效果不一样 .js文件 会把 0D 0A 变换为 0A 09 import { request } from…

图像去模糊:RSBlur 数据集以及模糊图像合成方法

本内容主要介绍图像去模糊数据集 RSBlur&#xff0c;以及逼真模糊图像合成方法。 论文&#xff1a;Realistic Blur Synthesis for Learning Image Deblurring 代码&#xff08;官方&#xff09;&#xff1a;https://github.com/rimchang/RSBlur 1.1 背景 运动模糊是由曝光…

89C52RC普中单片机-4

20230629 Thusday lcd1602代码 lcd1602.c #include <REGX52.H>//引脚配置&#xff1a; sbit LCD_RSP2^6; sbit LCD_RWP2^5; sbit LCD_ENP2^7; #define LCD_DataPort P0//函数定义&#xff1a; /*** brief LCD1602延时函数&#xff0c;12MHz调用可延时1ms* param 无*…

UNet Pytorch实现

用于图像分割的不同种类的Unet模型的实现 UNet - U-Net&#xff1a; 用于生物医学图像分割的卷积网络 https://arxiv.org/abs/1505.04597RCNN-UNet - 基于U-Net的递归残差卷积神经网络&#xff08;R2U-Net&#xff09;用于医学图像分割 https://arxiv.org/abs/1802.06955Atten…

ROS学习总结(一)

渐渐开始接触项目了&#xff0c;准备把以前学习的ros做一些总结&#xff0c;以致孰能生巧。 ros分布框架学习 vscode使用ros节点和包 vscode使用 下载&#xff1a;https://code.visualstudio.com/ 安装&#xff1a;sudo dpkg -i code(tap补全) code 能快捷启动。 插件安装&am…

django.db.utils.OperationalError: no such table: onlyoffice_customuser

我写了个类 Curstomuser 重新运行命令&#xff1a; >python manage.py makemigrations就报错了&#xff1a; 我以为是自己设计的类有问题&#xff0c;结果发现是因为我在其它 py 文件中进行了数据库查询。 而 Django 架构让我忽略了代码运行的前后关系。。。 先注释掉其它…