Rust实现黑客帝国数字雨特效

发布于:2025-07-04 ⋅ 阅读:(16) ⋅ 点赞:(0)

基于 Rust 和 actix-web 框架

以下是一些基于 Rust 和 actix-web 框架的数字下雨(类似黑客帝国风格的字符动画)的实现示例。这些例子展示了不同的实现方式,从基础到进阶,涵盖了 WebSocket、SSE(Server-Sent Events)和静态渲染等技术。


基础数字下雨(静态渲染)

一个简单的数字下雨效果,通过生成随机字符并渲染为 HTML 页面:

use actix_web::{get, App, HttpResponse, HttpServer, Responder};
use rand::Rng;

#[get("/")]
async fn digital_rain() -> impl Responder {
    let mut rng = rand::thread_rng();
    let mut rain = String::new();
    for _ in 0..100 {
        let c = rng.gen_range(33..126) as u8 as char;
        rain.push(c);
    }
    HttpResponse::Ok().body(format!("<pre style='color:#0f0;background:#000;font-family:monospace;'>{}</pre>", rain))
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| App::new().service(digital_rain))
        .bind("127.0.0.1:8080")?
        .run()
        .await
}

运行结果:


WebSocket 数字下雨

使用 WebSocket 实时推送数字下雨效果:

use actix::{Actor, StreamHandler};
use actix_web::{web, App, Error, HttpRequest, HttpResponse, HttpServer};
use actix_web_actors::ws;
use rand::Rng;

struct DigitalRainWs;

impl Actor for DigitalRainWs {
    type Context = ws::WebsocketContext<Self>;
}

impl StreamHandler<Result<ws::Message, ws::ProtocolError>> for DigitalRainWs {
    fn handle(&mut self, msg: Result<ws::Message, ws::ProtocolError>, ctx: &mut Self::Context) {
        match msg {
            Ok(ws::Message::Ping(msg)) => ctx.pong(&msg),
            Ok(ws::Message::Text(_)) => {
                let mut rng = rand::thread_rng();
                let mut rain = String::new();
                for _ in 0..100 {
                    let c = rng.gen_range(33..126) as u8 as char;
                    rain.push(c);
                }
                ctx.text(rain);
            }
            _ => (),
        }
    }
}

async fn ws_index(req: HttpRequest, stream: web::Payload) -> Result<HttpResponse, Error> {
    let resp =