闽公网安备 35020302035485号
[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,已被主流厂商广泛采用。