1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
| use tokio::net::{TcpListener, TcpStream};
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use bytes::{Buf, BufMut, BytesMut};
use std::error::Error;
// 零拷贝缓冲区
struct ZeroCopyBuffer {
buffer: BytesMut,
read_pos: usize,
}
impl ZeroCopyBuffer {
fn new(capacity: usize) -> Self {
ZeroCopyBuffer {
buffer: BytesMut::with_capacity(capacity),
read_pos: 0,
}
}
// 读取数据到缓冲区(零拷贝)
async fn read_from_stream(
&mut self,
stream: &mut TcpStream
) -> Result<usize, Box<dyn Error>> {
// 确保有足够空间
self.buffer.reserve(8192);
let mut temp = [0u8; 8192];
let n = stream.read(&mut temp).await?;
// 追加到缓冲区(零拷贝)
self.buffer.put_slice(&temp[..n]);
Ok(n)
}
// 获取读视图(零拷贝)
fn get_read_view(&self) -> &[u8] {
&self.buffer[self.read_pos..]
}
// 消费已读取的数据
fn consume(&mut self, n: usize) {
self.read_pos += n;
// 清理已消费的数据
if self.read_pos > self.buffer.len() / 2 {
self.buffer.advance(self.read_pos);
self.read_pos = 0;
}
}
}
// 高性能 HTTP 服务器
struct HttpServer {
listener: TcpListener,
buffer_pool: Arc<Mutex<Vec<BytesMut>>>,
}
impl HttpServer {
async fn new(addr: &str) -> Result<Self, Box<dyn Error>> {
Ok(HttpServer {
listener: TcpListener::bind(addr).await?,
buffer_pool: Arc::new(Mutex::new(Vec::new())),
})
}
async fn run(&self) -> Result<(), Box<dyn Error>> {
loop {
let (mut stream, addr) = self.listener.accept().await?;
println!("New connection from {}", addr);
let buffer_pool = self.buffer_pool.clone();
tokio::spawn(async move {
if let Err(e) = Self::handle_connection(&mut stream, buffer_pool).await {
eprintln!("Error handling connection: {}", e);
}
});
}
}
async fn handle_connection(
stream: &mut TcpStream,
buffer_pool: Arc<Mutex<Vec<BytesMut>>>,
) -> Result<(), Box<dyn Error>> {
// 从池中获取缓冲区
let mut buffer = {
let mut pool = buffer_pool.lock().await;
pool.pop().unwrap_or_else(|| BytesMut::with_capacity(8192))
};
let mut read_buffer = ZeroCopyBuffer::new(8192);
loop {
// 读取请求
let n = read_buffer.read_from_stream(stream).await?;
if n == 0 {
break;
}
// 解析 HTTP 请求
let request = Self::parse_request(read_buffer.get_read_view())?;
read_buffer.consume(request.raw_len);
// 生成响应
buffer.clear();
Self::generate_response(&request, &mut buffer);
// 发送响应(零拷贝)
stream.write_all(&buffer[..]).await?;
}
// 归还缓冲区到池
{
let mut pool = buffer_pool.lock().await;
pool.push(buffer);
}
Ok(())
}
fn parse_request(data: &[u8]) -> Result<HttpRequest, Box<dyn Error>> {
// 简化的 HTTP 请求解析
let request_str = std::str::from_utf8(data)?;
if let Some(line) = request_str.lines().next() {
let parts: Vec<&str> = line.split_whitespace().collect();
if parts.len() >= 2 {
return Ok(HttpRequest {
method: parts[0].to_string(),
path: parts[1].to_string(),
version: if parts.len() > 2 {
parts[2].to_string()
} else {
"HTTP/1.1".to_string()
},
raw_len: line.len() + 2, // +2 for CRLF
});
}
}
Err("Invalid HTTP request".into())
}
fn generate_response(request: &HttpRequest, buffer: &mut BytesMut) {
let response = format!(
"HTTP/1.1 200 OK\r\n\
Content-Type: text/html\r\n\
Content-Length: {}\r\n\
\r\n\
<html><body><h1>Hello, {}!</h1></body></html>",
request.path.len() + 28, // 粗略计算内容长度
request.path
);
buffer.put_slice(response.as_bytes());
}
}
struct HttpRequest {
method: String,
path: String,
version: String,
raw_len: usize,
}
|