Java实战:Spring Boot实现WebSocket实时通信

本文将详细介绍如何在Spring Boot应用程序中实现WebSocket实时通信。我们将探讨WebSocket的基本概念,以及如何使用Spring Boot和Spring WebSocket模块来实现WebSocket服务器和客户端。此外,我们将通过具体的示例来展示如何在Spring Boot应用程序中配置和使用WebSocket,以及如何实现实时消息传递和群发消息等功能。本文适合希望使用WebSocket技术实现实时通信的Spring Boot开发者阅读。

一、引言

在现代Web应用程序中,实时通信是一个关键需求,用于实现即时消息传递、在线聊天、实时数据同步等功能。WebSocket是一种网络通信协议,它提供了一种全双工通信渠道,允许服务器和客户端之间进行实时数据交换。Spring Boot提供了一种简便的方式来集成WebSocket技术,以实现实时通信功能。本文将介绍如何在Spring Boot应用程序中实现WebSocket实时通信。

二、WebSocket的基本概念

1. 什么是WebSocket?
WebSocket是一种网络通信协议,它提供了一种全双工通信渠道,允许服务器和客户端之间进行实时数据交换。WebSocket协议基于TCP协议,通过WebSocket连接,服务器和客户端可以相互发送消息,实现实时通信。
2. WebSocket的特点

  • 全双工通信:WebSocket协议支持服务器和客户端之间的全双工通信,客户端和服务器可以同时发送消息。
  • 持久连接:WebSocket连接一旦建立,将持续保持打开状态,直到客户端或服务器关闭连接。
  • 跨域通信:WebSocket协议支持跨域通信,允许不同域的服务器与客户端建立连接。

三、在Spring Boot中实现WebSocket实时通信

1. 添加Spring WebSocket依赖
在项目的pom.xml文件中,添加Spring Boot的Spring WebSocket依赖:

<dependencies><!-- Spring Boot Web依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot WebSocket依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>
</dependencies>

2. 创建WebSocket配置类
创建一个WebSocket配置类,用于配置WebSocket服务器端点。以下是一个简单的WebSocket配置类示例:

package com.example.demo.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.*;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@Overridepublic void configureMessageBroker(MessageBrokerRegistry config) {config.enableSimpleBroker("/topic");config.setApplicationDestinationPrefixes("/app");}@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {registry.addEndpoint("/websocket-endpoint").withSockJS();}
}

在上面的代码中,我们创建了一个名为WebSocketConfig的配置类,它实现了WebSocketMessageBrokerConfigurer接口。这个类用于配置WebSocket消息代理和注册STOMP(Simple Text Oriented Messaging Protocol)端点。
3. 创建消息模型
创建一个简单的消息模型类,用于表示WebSocket消息。以下是一个简单的消息模型类示例:

package com.example.demo.model;
public class Message {private String content;private String sender;// getter和setter方法
}

在上面的代码中,我们创建了一个名为Message的模型类,它包含两个属性:contentsender
4. 创建消息处理器
创建一个消息处理器类,用于处理WebSocket消息。以下是一个简单的消息处理器类示例:

package com.example.demo.handler;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo
import org.springframework.stereotype.Controller;
@Controller
public class MessageHandler {@MessageMapping("/send")@SendTo("/topic/messages")public Message sendMessage(Message message) {return new Message("Hello, WebSocket!", "System");}
}

在上面的代码中,我们创建了一个名为MessageHandler的控制器类,它包含一个名为sendMessage的方法。这个方法将处理发送到/send目的地的消息,并将消息发送到/topic/messages主题。
5. 创建前端代码
创建一个简单的HTML页面和JavaScript代码,用于连接到WebSocket服务器并发送消息。以下是一个简单的HTML页面示例:

<!DOCTYPE html>
<html>
<head><title>WebSocket Demo</title><script src="https://cdn.jsdelivr.net/npm/sockjs-client/dist/sockjs.min.js"></script><script src="https://cdn.jsdelivr.net/npm/stompjs/lib/stomp.min.js"></script>
</head>
<body><div><input type="text" id="messageInput" placeholder="Type a message..."><button onclick="sendMessage()">Send</button></div><ul id="messagesList"></ul><script>var socket = new SockJS('/websocket-endpoint');var stompClient = Stomp.over(socket);stompClient.connect({}, function (frame) {stompClient.subscribe('/topic/messages', function (message) {var messagesList = document.getElementById('messagesList');var listItem = document.createElement('li');listItem.textContent = message.body;messagesList.appendChild(listItem);});});function sendMessage() {var messageInput = document.getElementById('messageInput');stompClient.send('/app/send', {}, messageInput.value);messageInput.value = '';}</script>
</body>
</html>

在上面的代码中,我们创建了一个简单的HTML页面,包含一个输入框和一个按钮。当用户点击按钮时,JavaScript代码会连接到WebSocket服务器,并订阅/topic/messages主题。当服务器发送消息到该主题时,JavaScript代码会将消息添加到页面上的消息列表。

四、实现实时消息传递和群发消息

1. 实时消息传递
要实现实时消息传递,我们可以在MessageHandler类中创建一个方法,用于接收并处理从客户端发送的消息。以下是一个实现实时消息传递的示例:

package com.example.demo.handler;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
@Controller
public class MessageHandler {// 省略其他代码@MessageMapping("/receive")@SendTo("/topic/messages")public Message receiveMessage(Message message) {return new Message("Received your message: " + message.getContent(), "System");}
}

在上面的代码中,我们添加了一个名为receiveMessage的方法,用于接收并处理发送到/receive目的地的消息。这个方法会将接收到的消息发送到/topic/messages主题。
2. 群发消息
要实现群发消息,我们可以在WebSocketConfig类中配置一个广播代理。以下是一个实现群发消息的示例:

package com.example.demo.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.*;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {// 省略其他代码@Overridepublic void configureMessageBroker(MessageBrokerRegistry config) {config.enableSimpleBroker("/topic");config.setApplicationDestinationPrefixes("/app");config.setBrokerDeliveryMode(MessageBrokerRegistry.BrokerDeliveryMode.BROADCASTING);}// 省略其他代码
}

在上面的代码中,我们通过将setBrokerDeliveryMode方法的参数设置为BROADCASTING来启用广播代理。这意味着所有发送到/topic/messages主题的消息都会被广播到所有连接的客户端。

五、总结

本文详细介绍了如何在Spring Boot应用程序中实现WebSocket实时通信。我们首先了解了WebSocket的基本概念和特点,然后学习了如何使用Spring Boot和Spring WebSocket模块来实现WebSocket服务器和客户端。我们还通过具体的示例展示了如何在Spring Boot应用程序中配置和使用WebSocket,以及如何实现实时消息传递和群发消息等功能。
通过本文,您应该已经掌握了如何使用Spring Boot实现WebSocket实时通信。您学会了如何添加Spring WebSocket依赖、创建WebSocket配置类、创建消息模型、创建消息处理器,以及如何实现实时消息传递和群发消息。希望本文能够帮助您在开发Spring Boot应用程序时更加得心应手。如果您有任何疑问或建议,请随时留言交流。

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

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

相关文章

【探索AI】十二 深度学习之第2周:深度神经网络(一)深度神经网络的结构与设计

第2周&#xff1a;深度神经网络 将从以下几个部分开始学习&#xff0c;第1周的概述有需要详细讲解的的同学自行百度&#xff1b; 深度神经网络的结构与设计 深度学习的参数初始化策略 过拟合与正则化技术 批标准化与Dropout 实践&#xff1a;使用深度学习框架构建简单的深度神…

《More Effective C++》- 极精简版 1-10条

本文章属于专栏《业界Cpp进阶建议整理》 本文列出《More Effective C》的1-10条的个人理解的极精简版本。 1、仔细区分pointers和references 使用引用的情况&#xff1a; 一旦代表的该对象就不能改变&#xff0c;应该选择reference&#xff08;优势是使用时不需要判是否空&…

微信小程序的医院食堂订餐系统uniapp+vue+springboot/django/php

针对患者订餐的管理现状&#xff0c;本微信小程序的患者订餐主要实现以下几个目标&#xff1a; 1.系统界面简洁&#xff0c;操作简便。 2.拥有精准&#xff0c;高效的查询功能。 3.能使管理人员能够及时的获得精确的信息。 4.对数据内容的管理安全&#xff0c;…

安卓websocket(客服端和服务端写在app端) 案例

废话不多说直接上代码 首选导入 implementation "org.java-websocket:Java-WebSocket:1.4.0" package com.zx.qnncpds.androidwbsocket;import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button;import a…

腾讯:《智能科技 跨界相变——2024数字科技前沿应用趋势》

1月23日&#xff0c;腾讯发布了题为《智能科技 跨界相变——2024数字科技前沿应用趋势》的报告&#xff0c;报告从计算重塑、智能升维、沉浸交互、未来连接四个方面&#xff0c;对100多项未来技术和重点方向给出了趋势性判断。并表示我们正驶向一个由连接衍生交互、由计算催生智…

把简单留给用户,把复杂交给 AI

2024 年伊始&#xff0c;Kyligence 联合创始人兼 CEO 韩卿&#xff08;Luke&#xff09;分享了对 AI 与数据行业的一些战略思考&#xff0c;以及对中美企业服务市场的见解&#xff0c;引发业界同仁的广泛共鸣。正值 Kyligence 成立 8 周年&#xff0c;恰逢 AI 技术应用风起云涌…

leetcode 2.29

Leetcode hot100 二分查找1. 搜索插入位置2. 搜索二维矩阵 二分查找 1. 搜索插入位置 搜索插入位置 标准二分的写法&#xff1a; 复杂度分析 时间复杂度&#xff1a;O(log⁡n)&#xff0c;其中 n 为数组的长度。二分查找所需的时间复杂度为 O(log⁡n)。 空间复杂度&#xff1…

FLask会话技术和Flask模板语言

二、FLask会话技术和Flask模板语言 1.会话技术 cookie 客户端的会话技术&#xff1a;让服务器认识浏览器&#xff0c;常用于登录 cookie本身由浏览器保存&#xff0c;通过Response将cookie写到浏览器上&#xff0c;下一次访问&#xff0c;浏览器会根据不同的规则携带cookie过…

ssm656基于JAVA的校园失物招领平台的设计与实现

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一 、设计说明 1.1 课题…

(k8s中)docker netty OOM问题记录

1、首先查看docker的内存占用情况&#xff1a; docker top 容器名 -u 查看内存cpu占用率&#xff08;容器名来自kubectl describe pod xxx或者docker ps&#xff09; 可以看出内存一直增长&#xff0c;作为IO代理这是不正常的。 2、修改启动参数和配置文件 需要注意的是为了…

AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.01.01-2024.01.10

论文目录~ 1.RoboFusion: Towards Robust Multi-Modal 3D obiect Detection via SAM2.Aligned with LLM: a new multi-modal training paradigm for encoding fMRI activity in visual cortex3.3DMIT: 3D Multi-modal Instruction Tuning for Scene Understanding4.Incorporati…

电子科技大学课程《计算机网络系统》(持续更新)

前言 本校的课程课时有所缩减&#xff0c;因此可能出现与你学习的课程有所减少的情况&#xff0c;因此对其他学校的同学更多的作为参考作用。本文章适合学生的期中期末考试&#xff0c;以及想要考研电子科技大学的同学&#xff0c;电子科技大学同学请先看附言。 第一章 计算…

Unity - SerializeReference特性

作用&#xff1a;在编辑器面板上持久序列化一个接口或者抽象类对象 特点&#xff1a; 1.添加SerializeReference后, 即使字段是私有的, 也无需添加SerializeField属性, 二者同有将私有字段序列化的能力. 2.SerializeReference属性允许字段为null, 这点与默认序列化行为不同,…

Angular ts中监听变量

这边有个需求&#xff0c;需要监控某个input的变量变化&#xff0c;突然忘记怎么监听变量了&#xff0c;查了下&#xff0c;记录 这边使用angluar/core中的OnChanges接口&#xff0c;然后实现 ngOnChanges方法&#xff0c;只要变量发生了变化&#xff0c;这里面都可以监听到&am…

苹果手机如何下载微信视频号的视频?亲测可用的方法!

以下是如何下载微信视频号的视频的办法&#xff0c;首先是视频号下载提取器&#xff0c;下载视频号视频的&#xff01; 需配合微信PC版或者手机进行操作。这里以苹果手机为例 首先&#xff0c;你需要在视频号频道找到你想要下载的视频&#xff0c;然后通过点击选择你需要播放的…

[Android View] 可绘制形状 (Shape Xml)

一切以官方文档为主 官方文档https://developer.android.com/guide/topics/resources/drawable-resource?hlzh-cn#Shape 什么是可绘制形状 可以理解为用xml文件来描述一个简单的Drawable图形&#xff0c;比如说以下这段xml就可以用来描述一个白色的圆形&#xff1a; <?…

Centos中安装Docker及Docker的使用

在centos7系统中安装指定版本的docker,并通过docker使用安装mysql为例,阐述docker的使用。 2.1、Docker卸载及安装yum依赖 【卸载Docker,如果安装的Docker的版本不合适】 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-…

智能汽车软硬件产品CES展示汽车技术新亮点

智能汽车是汽车产业发展的新趋势&#xff0c;是未来汽车发展的必然方向。智能汽车是指搭载了先进的传感器、控制器、执行器等部件&#xff0c;并融合了人工智能、自动驾驶等技术&#xff0c;能够实现部分或完全自动驾驶、智能网联等功能的汽车。 近年来&#xff0c;智能汽车技…

抖店怎么开店注册?新手需要准备什么?这几个步骤很关键!

我是电商珠珠 不少人瞄准了抖店这个短视频电商势头&#xff0c;想要在今年大干一场。关于抖店注册这方面&#xff0c;部分人还不太清楚&#xff0c;今天我就带大家一步步注册&#xff0c;看一遍就会了。 前期准备资料 前期新手的话&#xff0c;需要准备一张个体工营业执照&a…

Java实战:Web实时消息推送技术

一、引言 随着互联网技术的飞速发展和用户对实时交互体验的追求&#xff0c;Web实时消息推送已成为众多在线平台的核心功能之一。无论是社交网络的新消息通知、协同办公工具的实时更新&#xff0c;还是电商平台的订单状态变更&#xff0c;都需要实时、准确地将信息推送到用户的…