以下是一个使用 tokio 库处理并发请求的示例代码,假设我们要实现一个简单的 HTTP 服务器,能够同时处理多个请求:
rust格式:
use std::net::SocketAddr;
use tokio::net::TcpListener;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
#[tokio::main]
async fn main() {
// 监听端口
let addr = SocketAddr::from(([127, 0, 0, 1], 8080));
let listener = TcpListener::bind(&addr).await.unwrap();
println!("Listening on: {}", addr);
loop {
// 等待并接受 let (mut socket, _) = listener.accept().await.unwrap();
// 使用 tokio 的 spawn 创建一个新的任务来处理连接
tokio::spawn(async move {
// 读取请求数据
let mut buffer = [0; 1024];
let n = match socket.read(&mut buffer).await {
Ok(n) if n == 0 => return,
Ok(n) => n,
Err(e) => {
eprintln!("Failed to read from socket; err = {:?}", e);
return;
}
};
let request = String::from_utf8_lossy(&buffer[..n]);
println!("Received request: {}", request);
// 构建响应
let response = "HTTP/1.1 200 OK\r\nContent-Length: 12\r\n\r\nHello World!";
// 发送响应
if let Err(e) = socket.write_all(response.as_bytes()).await {
eprintln!("Failed to write to socket; err = {:?}", e);
}
});
}
}
在这个示例中, tokio::main 宏标记了异步的入口点。服务器使用 TcpListener 监听端口,当有新的连接到来时,使用 tokio::spawn 创建一个新的任务来处理连接,这样可以同时处理多个连接请求。每个连接任务读取请求数据,然后发送一个简单的响应。