[dependencies] quinn = "0.10" tokio = { version = "1", features = ["full"] }实现一个简单的QUIC服务器
use quinn::{Endpoint, ServerConfig}; use std::{error::Error, net::SocketAddr, sync::Arc}; use tokio::runtime::Runtime; // 堆代码 duidaima.com fn main() -> Result<(), Box<dyn Error>> { let rt = Runtime::new()?; rt.block_on(async { let addr: SocketAddr = "127.0.0.1:4433".parse()?; let (endpoint, incoming) = make_server_endpoint(addr)?; println!("Server listening on {}", addr); while let Some(conn) = incoming.next().await { tokio::spawn(handle_connection(conn)); } }) } fn make_server_endpoint(addr: SocketAddr) -> Result<(Endpoint, quinn::Incoming), Box<dyn Error>> { let server_config = ServerConfig::default(); let endpoint = Endpoint::server(server_config, addr)?; Ok((endpoint, endpoint.incoming)) } async fn handle_connection(conn: quinn::Connecting) { let connection = conn.await.expect("connection failed"); println!("New QUIC connection established!"); }实现一个简单的QUIC客户端
use quinn::{ClientConfig, Endpoint}; use std::{error::Error, net::SocketAddr}; use tokio::runtime::Runtime; fn main() -> Result<(), Box<dyn Error>> { let rt = Runtime::new()?; rt.block_on(async { let addr: SocketAddr = "127.0.0.1:4433".parse()?; let endpoint = Endpoint::client("127.0.0.1:0".parse()?)?; let connection = endpoint .connect(addr, "localhost")? .await .expect("connection failed"); println!("Connected to server!"); }) }运行示例
cargo run --bin server2. 运行客户端:
cargo run --bin client谁在使用QUIC?
• AWS和Google Cloud:优化流量传输。
• 广泛应用:QUIC驱动HTTP/3,已被主流厂商广泛采用。