实时消息传送:WebSocket实现系统后台消息实时通知

news2024/12/26 0:16:36

实时消息传送:WebSocket实现系统后台消息实时通知

    • WebSocket简介
    • 基本实现步骤
      • 后台服务器
      • 后端接口
        • SimpMessagingTemplate
      • MessageDto
      • 前端客户端
    • 示例应用

在现代Web应用中,提供实时通知对于改善用户体验至关重要。WebSocket技术允许建立双向通信通道,从系统后台将消息实时传送给系统用户,并在前端以弹窗的形式通知用户。本文将深入探讨如何使用WebSocket来实现这一功能。

WebSocket简介

WebSocket是一种双向通信协议,与传统的HTTP通信不同,它支持持久连接,使得服务器能够主动向客户端推送消息。这使得WebSocket成为实时通信和消息传送的理想选择。

基本实现步骤

要实现系统后台消息的实时通知,我们可以遵循以下基本步骤:

后台服务器

在后台,我们需要创建一个WebSocket服务器来处理连接和消息广播。使用Java的WebSocket库,我们可以轻松建立WebSocket服务器。

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io IOException;
import java.util.concurrent.CopyOnWriteArrayList;

@ServerEndpoint("/websocket")
public class WebSocketServer {

    private static CopyOnWriteArrayList<Session> sessions = new CopyOnWriteArrayList<>();

    @OnOpen
    public void onOpen(Session session) {
        sessions.add(session);
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        // 处理收到的消息
    }

    @OnClose
    public void onClose(Session session) {
        sessions.remove(session);
    }

    public static void broadcastMessage(String message) {
        for (Session session : sessions) {
            try {
                session.getBasicRemote().sendText(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

后端接口

在后端,我们需要提供一个HTTP接口,以便系统后台可以发送消息给WebSocket客户端。这个接口接受POST请求,包含消息内容和接收者信息。为了实现这一功能,我们使用了Spring Framework的WebSocket支持,并引入了SimpMessagingTemplate

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MessageController {

    @Autowired
    private SimpMessagingTemplate messagingTemplate;

    @PostMapping("/send-message")
    public void sendMessageToUser(@RequestBody MessageDto message) {
        // 在此处,您可以执行任何逻辑以准备要发送的消息内容
        String messageContent = message.getContent();

        // 向指定用户发送消息
        messagingTemplate.convertAndSendToUser(message.getRecipient(), "/queue/messages", messageContent);
    }
}
SimpMessagingTemplate

SimpMessagingTemplate是Spring Framework的一部分,它允许在后端应用程序中将消息发送到WebSocket客户端的特定目的地(destination),以便将消息传递到订阅该目的地的WebSocket客户端。这是实现实时消息传递的关键工具,它允许后台将消息推送到WebSocket客户端,从而实现了实时通知功能。

SimpMessagingTemplate是Spring Framework中的一个类,它用于向WebSocket客户端发送消息。它是Spring的WebSocket支持模块的一部分,通常用于实现实时消息传递功能。以下是一些关于SimpMessagingTemplate的基本信息:

  • 用途SimpMessagingTemplate用于发送消息到WebSocket目的地(destination),使消息能够到达订阅该目的地的WebSocket客户端。

  • Spring WebSocket:Spring Framework提供了WebSocket支持,允许开发者构建具有实时消息传递功能的应用程序。SimpMessagingTemplate是这一支持的关键组件之一。

  • 示例用途:通常,SimpMessagingTemplate用于处理后端应用程序中的业务逻辑,然后将结果消息发送给前端的WebSocket客户端。这可以用于实现实时聊天、通知、即时数据传递等功能。

  • 目的地(destination):在Spring WebSocket中,消息发送到WebSocket客户端的特定位置被称为目的地。SimpMessagingTemplate允许您将消息发送到指定的目的地,WebSocket客户端通过订阅相应目的地来接收这些消息。

在上述示例中,SimpMessagingTemplate被用于向WebSocket客户端发送消息,实现了系统后台向用户发送实时通知的功能。它可以将消息发送到指定用户的特定目的地,以便将消息传递到具体的WebSocket订阅者。

要使用SimpMessagingTemplate,通常需要配置Spring WebSocket支持并注入该类。然后,您可以在后端的控制器或服务中使用它来发送消息给WebSocket客户端。

MessageDto

MessageDto是一个数据传输对象,包含了消息的接收者和内容。在HTTP请求的请求体中发送MessageDto对象。

public class MessageDto {
    private String recipient;
    private String content;

    // Getters and setters
}

前端客户端

在前端,我们需要创建WebSocket连接并处理从服务器接收到的消息。通常,我们可以将接收到的消息以弹窗的形式通知用户。

const socket = new WebSocket("ws://example.com/websocket");

socket.onopen = () => {
    console.log("WebSocket连接已建立");
};

socket.onmessage = (event) => {
    const message = event.data;
    // 使用弹窗通知用户
    showNotification(message);
};

socket.onclose = () => {
    console.log("WebSocket连接已关闭");
};

function showNotification(message) {
    // 使用浏览器的通知API或自定义弹窗组件来通知用户
    // 以下是一个简单的示例,使用浏览器通知API
    if ("Notification" in window) {
        if (Notification.permission === "granted") {
            new Notification("新消息", { body: message });
        } else if (Notification.permission !== "denied") {
            Notification.requestPermission().then((permission) => {
                if (permission === "granted") {
                    new Notification("新消息", { body: message });
                }
            });
        }
    }
}

示例应用

通过这个实例,系统后台可以使用WebSocket将重要消息实时通知给用户。用户将获得弹窗通知,无需刷新页面或等待长时间来查看消息。这种实时通知机制对于在线聊天应用、通知系统、即时交易平台等场景非常有用。

WebSocket技术为实现实时通知提供了一个强大而灵活的工具,允许系统后台与前端用户之间建立持久的双向通信通道。这种实时通信增强了用户体验,使用户能够快速响应重要信息。无论是社交媒体、电子邮件通知还是在线购物平台,WebSocket可以为您的应用程序提供实时通知功能。

通过WebSocket,您可以改进用户体验、提高用户参与度,并确保及时传达重要信息。实时消息传送是现代Web应用程序的重要组成部分,帮助您与用户建立更强的连接。

版权声明:
原创博主:牛哄哄的柯南
博主原文链接:https://keafmd.blog.csdn.net/
个人博客链接:https://www.keafmd.top/

看完如果对你有帮助,感谢点击下面的点赞支持!
[哈哈][抱拳]

在这里插入图片描述
加油!

共同努力!

Keafmd

感谢支持牛哄哄的柯南,期待你的三连+关注~~

keep accumulate for my dream【共勉】

                                                       ↓   ↓   ↓   ↓   ↓   ↓  

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

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

相关文章

08-React扩展

08-React扩展 1. setState的2种写法 案例&#xff1a; export default class Demo extends Component {state {count: 0}add () > {// 获取当前的值const { count } this.state// 更新状态this.setState({ count: count 1 })console.log(count);}render() {const { coun…

WSL2的安装与配置(创建Anaconda虚拟环境、更新软件包、安装PyTorch、VSCode)

1. WSL2 安装 以管理员身份打开 PowerShell&#xff08;“开始”菜单 >“PowerShell” >单击右键 >“以管理员身份运行”&#xff09;&#xff0c;然后输入以下命令&#xff1a; dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /a…

mfc140u.dll丢失的详细解决方法,最详细修复mfc140u.dll丢失的办法分享

在计算机技术日益发展的今天&#xff0c;我们不可避免地会遇到各种各样的技术问题。其中&#xff0c;“MFC140U.DLL丢失”是一个常见的错误&#xff0c;它可能会影响我们的电脑性能和软件运行。本文将详细介绍四种解决“MFC140U.DLL丢失”问题的方法。 首先&#xff0c;我们需…

详细解读DALLE 3技术报告:Improving Image Generation with Better Captions

Diffusion models代码解读&#xff1a;入门与实战 前言&#xff1a;OpenAI是推动大模型创新的领头羊&#xff0c;最近发布的DALLE 3凭借着远超市面上其他图片生成模型的表现&#xff0c;再次火出圈。最近OpenAI官方发布了DALLE 3的技术报告《Improving Image Generation with B…

Canvas和SvG的区别是什么?

Canvas和SVG是两种用于在Web上绘制图形的不同技术&#xff0c;它们有一些区别&#xff1a; 1&#xff1a;绘图方式&#xff1a; Canvas使用JavaScript API&#xff0c;通过在画布上绘制像素来创建图形。提供了对像素级别的控制&#xff0c;可以实现复杂的图形和动画效果。SVG…

项目经理之识别项目干系人

项目干系人管理是项目管理中的重要一环&#xff0c;识别和管理好项目干系人是成功实施项目的关键之一。本文将介绍4321项目干系人识别方法、干系人等级册以及五步判断法等工具&#xff0c;帮助项目经理更好地识别和管理项目干系人。同时&#xff0c;本文还将介绍干系人能量方格…

【疯狂Java讲义】Java学习记录(IO流)

IO流 IO&#xff1a;Input / Output 完成输入 / 输出 应用程序运行时——数据在内存中 ←→ 把数据写入硬盘&#xff08;磁带&#xff09; 内存中的数据不可持久保存 输入&#xff1a;从外部存储器&#xff08;硬盘、磁带、U盘&#…

在unity中利用公开变量引用物体和组件(有手就会)

在任意的脚本组件中&#xff08;必须先绑定物体&#xff09;&#xff0c;添加一个公开的 GameObject 类型的变量 using System.Collections; using System.Collections.Generic; using UnityEngine;public class test1 : MonoBehaviour {public GameObject other;// Start is …

蛋白质折叠

文章目录 4. GNNs for Protein foldingChemical Structures as GraphsProtein Structure PredictionMethods for Protein Structure PredictionOld method: fragment assemblyNew StrategyCo-evolution Analysis Towards An End-to-End Workflow AlphaFold2 architecture补充&a…

物联网AI MicroPython传感器学习 之 DRV8833电机驱动模块

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 DRV8833电机驱动模块是一种单H桥电机驱动芯片&#xff0c;可驱动2个直流电机和4线步进电机。内置过流保护&#xff0c;短路保护&#xff0c;欠压闭锁和过热保护&#xff0c;带低功耗睡眠模式。…

一篇文章讲懂mysql中的锁

事务的隔离性是由锁来实现的。 为什么需要锁 锁是计算机协调多个进程或线程并发访问某一资源的机制。在程序开发中会存在多线程同步的问题&#xff0c;当多个线程并发访问某个数据的时候&#xff0c;尤其是针对一些敏感的数据&#xff08;比如订单、金额等&#xff09;&#x…

高校教务系统登录页面JS分析——巢湖学院

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

UDP和TCP:奇妙的网络协议

之前&#xff0c;我们介绍了基本的网络原理和网络编程的相关知识&#xff0c;接下来会根据TCP/IP协议栈&#xff0c;具体的介绍这里的关键协议和知识。这部分知识虽然是理论为主&#xff0c;但是这是我们作为程序员的基本内功&#xff0c;非常重要。 本文我们重点介绍TCP和UDP…

TCP协议的报文结构及其特性

文章目录 一、TCP报头二、TCP的特性2.1确认应答2.2超时重传2.3连接管理2.3.1三次握手2.3.2四次挥手 2.4滑动窗口2.5流量控制2.6拥塞控制2.7延时应答2.8捎带应答2.9面向字节流2.10TCP异常情况的处理 一、TCP报头 TCP报头(header)分为11个部分&#xff0c;TCP报头大小为(20~60个…

springboot实现文件上传和读取

一.本地存储&#xff08;将图片存放在本地的nginx服务器上&#xff09; 在nginx上创建images目录&#xff0c;用来存储上传的文件 (使用nginx的好处是暴露端口&#xff0c;便于外界访问&#xff0c;同时nginx作为静态资源服务器在处理静态资源方面更快) 不然你访问文件就需要通…

android 13/14高版本SurfaceFlinger出现VSYNC-app/VSYNC-appSf/VSYNC-sf剖析

问题背景&#xff1a; 了解surfaceflinger的vsync同学都可能知道vsync属于一个节拍器&#xff0c;主要用来控制有节奏的渲染&#xff0c;不至于会产生什么画面撕裂等现象。 一般vsync都有会有2部分&#xff1a; app部分vsync&#xff0c;控制各个app可以有节奏的上帧 surfacef…

FPGA project : sdram

sdram读写控制器 实验目标&#xff1a; 设计并实现一个 SDRAM 数据读写控制器&#xff0c;使用 PC 机通过串口向 SDRAM 写入 10 字 节数据&#xff0c;并将写入的 10 字节数据读出&#xff0c;通过串口回传至 PC 机&#xff0c;在串口助手上位机上打印 显示回传数据。 框图设…

towxml的使用,在微信小程序中快速将markdown格式渲染为wxml文本

towxml的使用&#xff0c;在微信小程序中快速将markdown格式渲染为wxml文本 Towxml概述安装下载 Towxml在小程序中使用 towxml Towxml概述 towxml3.0 支持以下功能&#xff1a; ● echarts图表&#xff0c;默认禁用&#xff0c;需自行构建以开启此功能 ● LaTeX数学公式&#…

3D视觉硬件技术

目前市面上主流的3D光学视觉方案有三种&#xff1a; 双目立体视觉法&#xff08;Stereo Vision&#xff0c;在下文称双目法&#xff09;&#xff0c;结构光法&#xff08;Structured Light&#xff0c;在下文称结构光&#xff09;以及飞行时间法(Time of Flight, ToF在下文称T…

Java日志系统之Logback

目录 Logback Logback的简单使用 Logback配置文件 log4j.peoperties转化为logback.xml Logback Logback的性能要比log4j要好。 Logback分为三个模块&#xff1a; logback-core&#xff1a;其他两个模块的基础模块logback-classic&#xff1a;它是log4j的一个改良版本&am…