Rust:axum学习笔记(6) SSE(Server Send Event)服务端推送

上一篇继续,SSE也就是服务端推送技术,自html5推出以来基本上各大浏览器都已支持,axum自然也支持,参考下面的代码:

;gutter:true;
async fn sse_handler(
TypedHeader(user_agent): TypedHeader,
) -> Sse>> {
println!("
{} connected", user_agent.as_str());</p> <pre><code>let mut i = 0; // A that repeats an event every second let stream = stream::repeat_with(move || { i += 1; Event::default().data(format!("hi,{}", &i)) }) .map(Ok) .throttle(Duration::from_secs(3)); //每3秒,向浏览器发1次消息 //每隔1秒发1次保活 Sse::new(stream).keep_alive( axum::response::sse::KeepAlive::new() .interval(Duration::from_secs(1)) .text("keep-alive-text"), ) </code></pre> <p>}</p> <pre><code> 上面的代码,表示每3秒向浏览器发1次消息,每秒发1次keep-alive保活,完整代码如下: cargo.toml ;collapse:true;;gutter:true;
[package]
name = "sse"
version = "0.1.0"
edition = "2021"

See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
axum = {version = "0.4.3", features = ["headers"] }
tokio = { version = "1.0", features = ["full"] }
tower-http = { version = "0.2.0", features = ["fs", "trace"] }
futures = "0.3"
tokio-stream = "0.1"
headers = "0.3"

main.rs

cpp;collapse:true;;gutter:true; use axum::{ extract::TypedHeader, response::sse::{Event, Sse}, routing::get, Router, }; use futures::stream::{self, Stream}; use std::{convert::Infallible, net::SocketAddr, time::Duration}; use tokio_stream::StreamExt as _;</p> <h1>[tokio::main]</h1> <p>async fn main() { // build our application with a route let app = Router::new() .route("/sse", get(sse_handler)) .route("/", get(|| async { "Hello, World!" }));</p> <pre><code>// run it let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); axum::Server::bind(&addr) .serve(app.into_make_service()) .await .unwrap(); </code></pre> <p>}</p> <p>async fn sse_handler( TypedHeader(user_agent): TypedHeader, ) -> Sse>> { println!("<code>{}</code> connected", user_agent.as_str());</p> <pre><code>let mut i = 0; // A that repeats an event every second let stream = stream::repeat_with(move || { i += 1; Event::default().data(format!("hi,{}", &i)) }) .map(Ok) .throttle(Duration::from_secs(3)); //每3秒,向浏览器发1次消息 //每隔1秒发1次保活 Sse::new(stream).keep_alive( axum::response::sse::KeepAlive::new() .interval(Duration::from_secs(1)) .text("keep-alive-text"), ) </code></pre> <p>}</p> <pre><code> 运行效果: 先访问http://localhost:3000/ 然后在浏览器的console控制台,输入以下js: ;gutter:true;
var eventSource = new EventSource(‘/sse’);

eventSource.onmessage = function(event) {
console.log(‘Message from server ‘, event.data);
}

顺利的话,就能看到控制台不断输出服务端推送过来的数据:

Rust:axum学习笔记(6) SSE(Server Send Event)服务端推送

切换到Network面板,可以看到/sse返回的content-type为text/event-stream

Rust:axum学习笔记(6) SSE(Server Send Event)服务端推送

如果是chrome浏览器,直接访问/sse,还能看到keep-alive的动态输出

Rust:axum学习笔记(6) SSE(Server Send Event)服务端推送

Original: https://www.cnblogs.com/yjmyzz/p/axum_tutorial_6_sse.html
Author: 菩提树下的杨过
Title: Rust:axum学习笔记(6) SSE(Server Send Event)服务端推送

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/543881/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • The valid characters are defined in RFC 7230 and RFC 3986

    The valid characters are defined in RFC 7230 and RFC 3986 1.异常截图 2.原因说明 ​ 导致上述问题是因为tomcat自…

    Java 2023年6月8日
    0102
  • JAVA的环境配置以及多版本配置及详解

    一、概述 二、实践(以java8和java12为例,配置环境变量) 1.打开环境变量窗口 2.新建JAVA_HOME 3.修改Path 变量 4.新建CLASSPATH变量 5.验…

    Java 2023年6月15日
    061
  • spring boot 上传文件报错:java.io.IOException: The temporary upload location [/tmp/tomcat.xxx] is not valid

    springboot 项目上传文件报错:java.io.IOException: The temporary upload location [/tmp/tomcat.xxx] i…

    Java 2023年5月29日
    072
  • 3、封装和继承

    隐藏细节 通过访问修饰符private,有些细节不需要用户直接访问,将他隐藏起来。只能间接访问,通过提供一些共有的接口(给外部提供一个可以调用的方法) 会写JavaBean fin…

    Java 2023年6月6日
    066
  • Eclipse (indigo) 中安装jdk包并执行Maven

    为安装Eclipsejdk. windows->preferences->java->install jre->add sdk2. 假设在eclipse里增…

    Java 2023年5月30日
    077
  • 数据结构–稀疏数组和队列

    最近在学尚硅谷的数据结构,特此开一篇blog来做笔记 当一个数组中大部分元素是0时,或者为同一个值的数组时,可以用稀疏数组来保存该数组,节省储存空间(二维数组储存太浪费空间了) 应…

    Java 2023年6月8日
    096
  • JDK1.8 API 中文文档

    文档下载 链接: https://pan.baidu.com/s/1p1QUCxHyG_e71jfrT07l8g?pwd=ng8r提取码: ng8r 在线下载地址 https://…

    Java 2023年6月9日
    070
  • rocketmq延时消息

    rocketmq提供一种延时消息的解决方案,就是在特定的时间到了,消息才会被投递出去供 consumer消费。 总体来是简单的场景是满足了,但是需要注意的是延时的时间是需要按照默认…

    Java 2023年6月16日
    091
  • 这个开源组织里的项目都是精品

    前言 在开源中国里,不知道大家有没有留意到一个Java开源组织——Dromara? 这个组织是由Apache ShenYu(前身是Soul网关)的作者创立,多位Java开源作者参与…

    Java 2023年6月8日
    071
  • springboot分析——自定义启动类

    在实际开发过程中,如果有一些公共功能,我们可以单独封装,然后配置成starter启动类,其他的项目需要使用时,主要 只要依赖开启就可以了。下面我们自定义一个自动配置启动类。 一:自…

    Java 2023年5月30日
    069
  • Linux命令(一)

    文件列表 ls #表示查看当前目录下的文件 ls -a #表示查看当前目录下的所有文件(包含隐藏文件) ls -l #表示查看当前目录下的详细信息 ll #表示查看当前目录下的详细…

    Java 2023年6月6日
    076
  • 阻塞非阻塞和同步异步的区分 参考一些书籍

    编程中一直对这两个概念不是很理解,在网上搜了很多资料大概描述的其实都很模糊,有时候还自相矛盾,很容易搞混,这里说一下我对这两个概念的理解。首先看一下相关技术书籍对这两个概念的描述,…

    Java 2023年6月6日
    088
  • javascript基本属性访问对象的属性和方法

    var myName = “Shelley”; //字符串基本类型 alert(myName.length); //隐式创建String对象,数值与myNa…

    Java 2023年6月6日
    067
  • elasticsearch集群搭建

    1.部署es集群 我们会在单机上利用docker容器运行多个es实例来模拟es集群。不过生产环境推荐大家每一台服务节点仅部署一个es的实例。 部署es集群可以直接使用docker-…

    Java 2023年6月9日
    069
  • [Java编程思想] 第四章 控制执行流程

    4.1 true和false Java不允许将一个数字作为布尔值使用。 4.2 迭代 while、do-while和for控制着循环,有时将其划分为”迭代语句&#822…

    Java 2023年6月5日
    096
  • 【SpringCloud-Alibaba系列教程】10.gateway网关

    简介 在SpringCloud中网关作为一个重要的组成部分,网关的角色是作为一个 API 架构,用来保护、增强和控制对于 API 服务的访问。API 网关是一个处于应用程序或服务(…

    Java 2023年6月5日
    096
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球