好的,这是一个使用 Rust 语言实现的文件服务器的简单示例:
``` use std::fs; use std::io::{Error, ErrorKind}; use std::net::{TcpListener, TcpStream}; use std::thread;
fn main() -> Result<(), Error> { // 监听本地的 8080 端口 let listener = TcpListener::bind("127.0.0.1:8080")?;
// 不断循环,接受来自客户端的连接
for stream in listener.incoming() {
let stream = stream?;
// 创建新的线程处理每个客户端连接
thread::spawn(move || {
// 尝试从请求中解析出文件路径
let file_path = parse_request(&stream);
if let Some(path) = file_path {
// 尝试读取文件内容
let contents = match fs::read(&path) {
Ok(contents) => contents,
Err(_) => {
// 如果文件不存在,返回 404 错误
let mut stream = stream;
stream.write_all(b"HTTP/1.1 404 NOT FOUND\r\n\r\n").unwrap();
return;
}
};
// 向客户端发送文件内容
let mut stream = stream;
stream.write_all(b"HTTP/1.1 200 OK\r\n\r\n").unwrap();
stream.write_all(&contents).unwrap();
} else {
// 如果无法解析出文件路径,返回 400 错误
let mut stream = stream;
stream.write_all(b"HTTP/1.1 400 BAD REQUEST\r\n\r\n").unwrap();
}
});
}
Ok(())
}
// 尝试从 HTTP 请求中解析出文件路径 fn parse_request(stream: &TcpStream) -> Option { // 读取请求的第一行,确定是 GET 请求 let mut buffer = [0; 512]; stream.read(&mut buffer).unwrap(); let request = String::from_utf8_lossy(&buffer[..]); let request_lines: Vec<&str>