C#基于SSE传递消息给Vue前端实现即时单向通讯

news2024/9/24 3:28:39

一、简述

        通常前端调用后端的API,调用到了,等待执行完,拿到返回的数据,进行渲染,流程就完事了。如果想要即时怎么办?如果你想问什么场景非要即时通讯,那可就很多了,比如在线聊天、实时数据推送、视频会议等等。

        本人这里是要实现的流程是,Vue调用C#的API,然后API内新线程调用python执行任务,然后API就给前端返回执行开始的消息,Vue和API就结束了。但是python执行的是十分耗时的任务,需要不断的把中间节点的消息输出到前端,是这样子一个场景。

        python把消息不能直接输出到前端,而是要返回给c#,这个通c#的Process接收消息,就可以获得到,然后就是c#如果把消息传递给前端的事情了,所以做了一下调研。

二、技术路线

        一共有三种技术路线。

1、websocket

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }
 
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/progress").withSockJS();
    }
}
 
@Controller
public class ProgressController {
 
    @MessageMapping("/progress")
    @SendTo("/topic/progress")
    public ProgressMessage updateProgress(ProgressMessage progressMessage) {
        // 这里可以是更新进度的逻辑
        return progressMessage;
    }
}
 
public class ProgressMessage {
    private int progress;
    // 省略构造函数、getter和setter
}

        vue参考代码

<template>
  <div>
    <progress :value="progressValue" max="100"></progress>
  </div>
</template>
 
<script>
export default {
  data() {
    return {
      progressValue: 0,
      socket: null
    };
  },
  created() {
    this.socket = new SockJS('/progress');
    let stompClient = Stomp.over(this.socket);
    stompClient.connect({}, frame => {
      stompClient.subscribe('/topic/progress', progressData => {
        let progress = JSON.parse(progressData.body).progress;
        this.progressValue = progress;
      });
    });
  },
  beforeDestroy() {
    this.socket.close();
  }
};
</script>

2、长轮询

        长轮询就特别简单,前端搞个定时器,不断的调用接口,这种方法适合不那么即时的,否则量大了,就是麻烦事。

@RestController
public class TaskController {

    @GetMapping("/task/progress/{taskId}")
    public int getProgress(@PathVariable String taskId) {
        // 查询任务进度
        int progress = taskService.getProgress(taskId);
        return progress;
    }
}

        vue参考代码

export default {
  data() {
    return {
      progress: 0,
      taskId: '123' // 替换为实际任务ID
    };
  },
  mounted() {
    this.getProgress();
  },
  methods: {
    getProgress() {
      this.$http.get(`/task/progress/${this.taskId}`)
        .then(response => {
          this.progress = response.data;
          // 继续轮询
          setTimeout(this.getProgress, 1000); 
        });
    }
  }
}

3、Server-Sent Events(SSE)

        SSE 维护一个开放的 HTTP/1.1 连接,SSE请求将保持打开状态,直到客户端或服务器决定结束它,并且只是将新信息简单地写入缓冲区。

        C#API参考代码。

[HttpGet("{id}")]
public async Task PushMessage(int id)
{
    Response.Headers["Content-Type"] = "text/event-stream";
    Response.Headers["Cache-Control"] = "no-cache";
    Response.Headers["Connection"] = "keep-alive";
    Response.Headers["Access-Control-Allow-Origin"] = "*"; // 允许跨域


    try
    {
        await Response.WriteAsync($"data: 服务器已经连接\r\r");
        await Response.Body.FlushAsync();
        await Task.Delay(1000);
    }
    catch (Exception ex)
    {
        System.Console.WriteLine("异常:"+ex.ToString());
    }
    finally
    {
        System.Console.WriteLine("客户端断开");
    }
}

        vue参考代码

mounted() {
    //后面跟的this.data.fid,是我需要的,如果不需要可以去掉,并修改c#的接口
    this.source = new EventSource('http://你的接口地址/PushMessage/' + this.data.fid);
    this.source.onmessage = (event) => {
      if (event.data === '服务器已经连接')
      {
        this.connection = false
      }
      else
      {
        this.pythonLog += '<br/>'
        this.pythonLog += event.data
      }
      // const data = JSON.parse(event.data);
      // console.log(event.data)
      // this.events.push({ id: Date.now(), data: data });
    }
    this.source.onerror = (error) => {
      console.error('SSE error:', error)
    }
  },

三、总结

1、小结

        上面的websocket的代码是从别人哪里直接copy来的,没有进行测试。长轮询的代码也没有什么值得参考的。但是最后的SSE的代码片段是经过验证的,只不过C#端的API里面精简了。

        总结来说,SSE更简单轻量,如果不需要维护太多状态,实时性还强,也不需要双向通讯,是比较好的选择。

        如果需要双向通讯,必然是websocket。

        如果是可以不那么频繁隔一段时间请求看看,成功失败都行的,长轮询就比较适合了。

2、注意事项 

大多数 Web 服务器都配置了请求超时。例如,Nginx默认proxy_read_timeout为60 秒。

另外根据服务器的不同,您可能需要配置各种缓存和缓冲机制。

不能无限制的使用,早期的浏览器的每个域的活动连接数限制为6个,现在的浏览器有所增加,但也不是无限制的。如果超出此限制,请求都将被停止,就会卡住(没有这方面的经验,ibm的网站说的)。另外csdn伤别人的说法是升级为HTTP2.0,需要域名和证书。

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

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

相关文章

HQL,SQL刷题,尚硅谷(中级)

目录 相关表结构&#xff1a; 1、order_info表 2、order_detail表 题目及思路解析&#xff1a; 第一题&#xff0c;查询各品类销售商品的种类数及销量最高的商品 第二题 查询用户的累计消费金额及VIP等级 第三题 查询首次下单后第二天连续下单的用户比率 总结归纳&#xff1a…

C#版Facefusion:让你的脸与世界融为一体!-02 获取人脸关键点

C#版Facefusion&#xff1a;让你的脸与世界融为一体&#xff01;-02 获取人脸关键点 目录 说明 效果 模型信息 项目 代码 下载 说明 C#版Facefusion一共有如下5个步骤&#xff1a; 1、使用yoloface_8n.onnx进行人脸检测 2、使用2dfan4.onnx获取人脸关键点 3、使用arcfa…

【MATLAB源码-第36期】matlab基于BD,SVD,ZF,MMSE,MF,SLNR预编码的MIMO系统误码率分析。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. MIMO (多输入多输出)&#xff1a;这是一个无线通信系统中使用的技术&#xff0c;其中有多个发送和接收天线。通过同时发送和接收多个数据流&#xff0c;MIMO可以增加数据速率和系统容量&#xff0c;同时提高信号的可靠性。…

算法1: 素数个数统计

统计n以内的素数个数 素数&#xff1a;只能被1和自身整除的自然数&#xff0c;0和1除外&#xff1b; 举例&#xff1a; 输入&#xff1a;100 输出&#xff1a;25 import java.util.*; class Test1{public static void main(String[] args){int a 100; //输入数字//…

41、二叉树-二叉树的层序遍历

思路&#xff1a; 层序遍历就是从左到右依次遍历。这个时候就可以使用队列的方式。例如先把头节点入队&#xff0c;然后遍历开始&#xff0c;首先计算队列长度&#xff0c;第一层&#xff0c;长度为了&#xff0c;遍历一次&#xff0c;依次出队&#xff0c;头结点出队&#xff…

Redis的RedisObject和对外可见的5种数据结构

目录 RedisObject Redis的编码方式 对外可见的5种数据结构 1.string string结构的源码 为什么是小于44字节会采用embstr编码&#xff1f; embstr和raw区别 2.list list结构的源码 3.set set结构的源码 4.zset zset结构的源码 5.hash hash结构的源码 Redis中…

淘宝客订单产品设计:连接商家与推广者的智能桥梁

随着电商行业的迅速发展&#xff0c;淘宝客作为一种常见的推广方式&#xff0c;为商家引流、提升销量发挥了重要作用。而淘宝客订单产品的设计&#xff0c;则是连接商家与推广者的智能桥梁&#xff0c;本文将对其进行探讨与分析。 ### 1. 淘宝客订单产品的定义 淘宝客订单产品…

梯度提升树(Gradient Boosting Trees)

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个梯度提升树&#xff08;Gradient Boosting Trees&#xff09;模型程序,最后打印5个条件分别的影响力。 示例一 梯…

【目标检测】Focal Loss

Focal Loss用来解决正负样本不平衡问题&#xff0c;并提升训练过程对困难样本的关注。 在一阶段目标检测算法中&#xff0c;以YOLO v3为例&#xff0c;计算置信度损失&#xff08;图中第3、4项&#xff09;时有目标的点少&#xff0c;无目标的点多&#xff0c;两者可能相差百倍…

WSL(Ubuntu)、PC物理机,linux开发板三个设备通讯,镜像模式

文章目录 一、前言二、使用2.1 需要的系统信息2.2 添加 .wslconfig 文件 三、如何从局域网访问WSL中的服务 一、前言 最近在使用Linux开发板的环境下&#xff0c;由于使用的 WSL的子系统&#xff0c;并不是虚拟机&#xff0c;导致 网络传输 这方面不是很方便&#xff0c;由于 W…

AGM AG32 MCU在汽车UWB应用方案

AG32的汽车UWB应用方案 汽车电子产品的日益成熟&#xff0c;包括ADAS和车载信息娱乐&#xff0c;正在推动对CPLD的需求。例如&#xff0c;利用安装在车上的各种传感器&#xff08;如雷达、摄像头和激光雷达等&#xff09;来感知周围环境&#xff0c;实现实时监测和数据处理。这…

docker容器技术篇:数据卷的常用操作

Docker数据卷的使用 在docker中&#xff0c;为了方便查看容器内产生的数据或者将多个容器中的数据实现共享&#xff0c;就涉及到容器数据卷管理&#xff0c;那什么是数据卷呢&#xff0c;往下看&#xff01;&#xff01;&#xff01; 1 数据卷概念 数据卷是一个共给容器使用…

一款挺不错网站维护页面HTML源码

一款挺不错网站维护页面源码&#xff0c;单HTML不需要数据库&#xff0c;上传到你的虚拟机就可以用做维护页面还不错&#xff0c;用处多。。 源码下载 一款挺不错网站维护页面源码

C# - 反射动态添加/删除Attribute特性

API: TypeDescriptor.AddAttributes TypeDescriptor.GetAttributes 注意&#xff1a;TypeDescriptor.AddAttributes添加的特性需要使用 TypeDescriptor.GetAttributes获取 根据api可以看到&#xff0c;该接口不仅可以给指定类&#xff08;Type&#xff09;添加特性&#xf…

设计模式——模版模式21

模板方法模式在超类中定义了一个事务流程的框架&#xff0c; 允许子类在不修改结构的情况下重写其中一个或者多个特定步骤。下面以ggbond的校招礼盒发放为例。 设计模式&#xff0c;一定要敲代码理解 模版抽象 /*** author ggbond* date 2024年04月18日 17:32* 发送奖品*/ p…

华为框式交换机S12700E系列配置CSS集群

搭建集群环境 a.为两台交换机上电&#xff0c;按照数据规划分别对两台框式交换机进行配置 <HUAWEI> system-view [HUAWEI] sysname Switch1 [Switch1] set css id 1 [Switch1] set css priority 150 //框1的集群优先级配置为150 [Switch1] interface css-port 1 [Sw…

后端-MySQL-week11 多表查询

tips: distinct————紧跟“select”之后&#xff0c;用于去重 多表查询 概述 一对多&#xff08;多对一&#xff09; 多对多 一对一 多表查询概述 分类 连接查询 内连接 外连接 自连接 必须起别名&#xff01; 联合查询-union&#xff0c;union all 子查询 概念 分类 …

家庭营销广告Criteo公司首次获得MRC零售媒体测量认证

家庭营销广告Criteo公司首次获得零售媒体测量MRC认证 商业媒体公司Criteo2024年3月28日宣布&#xff0c;它首次获得媒体评级委员会&#xff08;MRC&#xff09;的认证&#xff0c;在其企业零售媒体平台commerce Max和commerce Yield上&#xff0c;在桌面、移动网络和移动应用内…

Goland远程连接Linux进行项目开发

文章目录 1、Linux上安装go的环境&#xff12;、配置远程连接3、其他配置入口 跑新项目&#xff0c;有个confluent-Kafka-go的依赖在Windows上编译不通过&#xff0c;报错信息&#xff1a; undefined reference to __imp__xxx似乎是这个依赖在Windows上不支持&#xff0c;选择让…

阿里云ECS迁移至AWS EC2,九河云详细教程

在客户在求更大的海外市场&#xff0c;综合考虑后决定选择AWS云&#xff0c;但对迁移方面不太了解&#xff0c;甚至比较担心如果到AWS云是否业务要从0开始&#xff1f;本文九河云将为您介绍如何将阿里云ECS平滑迁移至AWS。 工具介绍 AWS Application Migration Service &…