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

async fn sse_handler(
TypedHeader(user_agent): TypedHeader<headers::UserAgent>,
) -> Sse<impl Stream<Item = Result<Event, Infallible>>> {
println!("`{}` connected", user_agent.as_str()); let mut i = 0;
// A `Stream` 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"),
)
}

上面的代码,表示每3秒向浏览器发1次消息,每秒发1次keep-alive保活,完整代码如下:

cargo.toml

[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

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 _; #[tokio::main]
async fn main() {
// build our application with a route
let app = Router::new()
.route("/sse", get(sse_handler))
.route("/", get(|| async { "Hello, World!" })); // run it
let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
axum::Server::bind(&addr)
.serve(app.into_make_service())
.await
.unwrap();
} async fn sse_handler(
TypedHeader(user_agent): TypedHeader<headers::UserAgent>,
) -> Sse<impl Stream<Item = Result<Event, Infallible>>> {
println!("`{}` connected", user_agent.as_str()); let mut i = 0;
// A `Stream` 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"),
)
}

运行效果:

先访问http://localhost:3000/ 然后在浏览器的console控制台,输入以下js:

var eventSource = new EventSource('/sse');

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

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

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

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

Rust:axum学习笔记(6) SSE(Server Send Event)服务端推送的更多相关文章

  1. 使用 SignalR与SSE(Sever sent event)向客户端推送提示信息

    最近有个项目想把c/s的代码转成mvc的,这听起来并不困难. 如果UI和业务逻辑良好分离了的话,不会花太多的功夫,应该多数的内容都能重复利用. 但在实际的操作过程中,发现业务逻辑代码和UI提示全是混在 ...

  2. NodeJS学习笔记 进阶 (1)Nodejs进阶:服务端字符编解码&乱码处理(ok)

    个人总结:这篇文章主要讲解了Nodejs处理服务器乱码及编码的知识,读完这篇文章需要10分钟. 摘选自网络 写在前面 在web服务端开发中,字符的编解码几乎每天都要打交道.编解码一旦处理不当,就会出现 ...

  3. Python--网络编程学习笔记系列02 附:tcp服务端,tcp客户端

    Python--网络编程学习笔记系列02 TCP和UDP的概述: udp通信模型类似于写信,不需要建立相关链接,只需要发送数据即可(现在几乎不用:不稳定,不安全) tcp通信模型类似于打电话,一定要建 ...

  4. Nginx 学习笔记(十)介绍HTTP / 2服务器推送(译)

    原文地址:https://www.nginx.com/blog/nginx-1-13-9-http2-server-push/ 我们很高兴地宣布,2018年2月20日发布的NGINX 1.13.9支持 ...

  5. zeromq学习笔记2——简单的客户端和服务端测试程序

    1.前言 zeromq提供了guide,http://zguide.zeromq.org/,可以帮助新手快速上手,提供了C\C++\PHP等多种语言. 2.测试程序 使用zeromq给的hwserve ...

  6. http2 技术整理 nginx 搭建 http2 wireshark 抓包分析 server push 服务端推送

    使用 nginx 搭建一个 http2 的站点,准备所需: 1,域名 .com .net 均可(国内域名需要 icp 备案) 2,云主机一个,可以自由的安装配置软件的服务器 3,https 证书 ht ...

  7. android菜鸟学习笔记25----与服务器端交互(二)解析服务端返回的json数据及使用一个开源组件请求服务端数据

    补充:关于PHP服务端可能出现的问题: 如果你刚好也像我一样,用php实现的服务端程序,采用的是apache服务器,那么虚拟主机的配置可能会影响到android应用的调试!! 在android应用中访 ...

  8. springmvc 中开发Server Send Event

    springmvc 中开发Server Send Event 学习了:http://blog.csdn.net/leiliz/article/details/55195203 https://www. ...

  9. 【转】 Pro Android学习笔记(七八):服务(3):远程服务:AIDL文件

    目录(?)[-] 在AIDL中定义服务接口 根据AIDL文件自动生成接口代码 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.n ...

  10. golang学习笔记18 用go语言编写移动端sdk和app开发gomobile

    golang学习笔记18 用go语言编写移动端sdk和app开发gomobile gomobile的使用-用go语言编写移动端sdk和app开发https://blog.csdn.net/u01249 ...

随机推荐

  1. Bagging、Boosting、Stacking的原理

      Bagging.Boosting.Stacking是常见集成学习的形式,它们都是通过对多个学习器进行有机组合,达到比单个学习器性能更好的目标. 一.Bagging 1.算法概述   Bagging ...

  2. K8s新手系列之Pod中容器的镜像拉取策略

    概述 在 Kubernetes(K8s)里,容器镜像拉取策略(ImagePullPolicy)决定了 K8s 在创建或重启 Pod 时,如何处理容器镜像的拉取操作.这一策略能够确保使用的镜像始终是最新 ...

  3. 【笔记】Python爬虫|网页数据异步加载(结合Selenium完成)

    文章目录 问题描述 1. 结合Selenium.Edge解析该网站搜索页面的数据 2. 结合lxml解析网页数据 3. 附加:不是异步加载的网页,结合requests直接请求数据 问题描述 一些网站会 ...

  4. 操作系统综合题之“短进程优先调度算法(Shortest-Process-First,SPF)和非抢占式优先权调度算法(Priority-Scheduling Lgorithm)的进程执行顺序并计算周转时间以及平均周转时间【分开计算题】”

    一.问题: 1.当系统采用短进程优先调度算法时,试写出进程的执行顺序,并计算各个进程的周转时间以及平均周转时间 2.当系统采用优先权调度算法时,试写出进程的执行顺序,并计算各个进程的周转时间以及平均周 ...

  5. python简单的time ticker

    在某些时候,我们需要精确的启动一个func,如果用time.sleep简单的轮询,会因为执行的任务阻塞,或者其他原因导致无法精确的定时执行. 例如在采集某些数据的时候,需要精确的每60秒采集一次,如果 ...

  6. 网络编程:C10K问题

    C10K问题 C10K问题就是如何一台物理机上同时服务10000个用户?C代表并发,10K就是10000 C10K 问题是由一个叫 Dan Kegel 的工程师提出并总结归纳的,你可以通过访问http ...

  7. MethodImpl优化性能

    参数解释 MethodImplOptions.AggressiveInlining:请求编译器在可能的情况下对方法进行内联. MethodImpl:这是一个属性,允许开发者为方法指定特定的实现行为,比 ...

  8. [VulnHub]DC-2靶场全过程

    DC-2 信息收集 arp-scan -l nmap -sP 192.168.190.0/24 kali靶机:192.168.190.128 DC-2靶机:192.168.190.138 知道了靶机i ...

  9. 用脚手架创建odoo15项目

    Odoo 提供了一种机制来帮助建立一个新模块,odoo-bin有一个子命令脚手架来创建一个空模块 命令: $ odoo-bin scaffold <module name> <whe ...

  10. 异常分析 JedisConnectionException: java.net.SocketTimeoutException: Read timed out

    问题描述   测试Redis分布式锁的时候,如果一次执行大量数据,系统会报出如下异常: JedisConnectionException: java.net.SocketTimeoutExceptio ...