Rust实现黑客帝国数字雨特效
基于 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 =