rust poem sse
Cargo.toml
:
[package]
name = "sse"
version = "0.1.0"
edition = "2021"
[dependencies]
futures-util = "0.3.30"
poem = { version = "3.0.3", features = ["sse"] }
tokio = { version = "1.39.1", features = ["rt-multi-thread", "macros"] }
tokio-stream = "0.1.15"
tracing-subscriber = "0.3.18"
main.rs
:
use std::time::Instant;
use futures_util::StreamExt;
use poem::{
get, handler,
listener::TcpListener,
web::{
sse::{Event, SSE},
Html,
},
Route, Server,
};
use tokio::time::Duration;
#[handler]
fn index() -> Html<&'static str> {
Html(
r#"
<script>
let eventSource = new EventSource('event');
eventSource.onmessage = function(event) {
document.write("<div>" + event.data + "</div>");
}
</script>
"#,
)
}
#[handler]
fn event() -> SSE {
let now = Instant::now();
SSE::new(
tokio_stream::wrappers::IntervalStream::new(tokio::time::interval(Duration::from_secs(1)))
.map(move |_| Event::message(now.elapsed().as_secs().to_string())),
)
.keep_alive(Duration::from_secs(5))
}
#[tokio::main]
async fn main() -> Result<(), std::io::Error> {
if std::env::var_os("RUST_LOG").is_none() {
std::env::set_var("RUST_LOG", "poem=debug");
}
tracing_subscriber::fmt::init();
let app = Route::new().at("/", get(index)).at("/event", get(event));
Server::new(TcpListener::bind("0.0.0.0:8080"))
.run(app)
.await
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话