首页 > 其他分享 >rust poem sse

rust poem sse

时间:2024-07-24 12:07:11浏览次数:10  
标签:poem use tokio sse new event rust

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
}

标签:poem,use,tokio,sse,new,event,rust
From: https://www.cnblogs.com/soarowl/p/18320587

相关文章

  • rust axum sse
    Cargo.toml:[package]name="sse"version="0.1.0"edition="2021"[dependencies]axum="0.7.5"axum-extra={version="0.9.3",features=["typed-header"]}eventsource-stream="0.2......
  • SpringBoot整合SSE技术详解
    SpringBoot整合SSE技术详解1.引言在现代Web应用中,实时通信变得越来越重要。Server-SentEvents(SSE)是一种允许服务器向客户端推送数据的技术,为实现实时更新提供了一种简单而有效的方法。本文将详细介绍如何在SpringBoot中整合SSE,并探讨SSE与WebSocket的区别。2.SS......
  • java中assert用法
    java中assert用法一、java为什么源码框架都用assert调试1、一般是做单元测试的时候用(比如Junit),其它的地方也可以使用,但是基本上没人用,因为在其它的地方判断语句比断言好用。2、如果表达式计算为false,那么系统会报告一个Assertionerror。3、由于assert是一个新关键字,使用老......
  • gofiber sse
    packagemainimport( "bufio" "fmt" "log" "time" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/cors" "github.com/valyala/fasthttp")varindex=[]byte......
  • 【数据结构】排序算法——Lessen1
    Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎~~......
  • PyTorch LSTM 模型上的 CrossEntropyLoss,每个时间步一分类
    我正在尝试创建一个LSTM模型来检测时间序列数据中的异常情况。它需要5个输入并产生1个布尔输出(如果检测到异常则为True/False)。异常模式通常连续3-4个时间步长。与大多数LSTM示例不同,它们预测未来数据或对整个数据序列进行分类,我尝试在每个时间步输出True/False检......
  • Rust 发散函数
    发散函数发散函数(divergingfunction)绝不会返回。它们使用!标记,这是一个空类型。fnfoo()->!{panic!("Thiscallneverreturns.");}和所有其他类型相反,这个类型无法实例化,因为此类型可能具有的所有可能值的集合为空。注意,它与()类型不同,后者只有一个可......
  • rust may_minihttp server
    Cargo.toml:[package]name="demo"version="0.1.0"edition="2021"[dependencies]bytes="1.6.1"may="0.3.45"may_minihttp={git="https://github.com/Xudong-Huang/may_minihttp.git"}y......
  • REASSESSMENT TASK
    ResubmissionAssessmentTitle:ResubmissionassignmentUnitLevel:6ReassessmentNumber:1of1CreditValueofUnit:20DateIssued:04/07/2024UnitLeader:PaulDeVriezeSubmissionDueDate:01/08/2024Time:12:30PMOtherMarker(s):N/ASubmissionLocati......
  • Rust语言圣经-流程控制
    提问索引访问集合和for遍历有什么区别回答//第一种letcollection=[1,2,3,4,5];foriin0..collection.len(){letitem=collection[i];//...}//第二种foritemincollection{}使用索引(第一种)访问会因边界访问导致性能损耗;当遍历集合发生改变......