blob: ad85a8095680153e490b8e1799c282be4783f730 (
plain)
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
|
// luwenpeng 2022/11/01
use futures::StreamExt;
use mini_rust_runtime::executor::Executor;
use mini_rust_runtime::tcp::TcpListener;
use tokio::io::AsyncReadExt;
use tokio::io::AsyncWriteExt;
fn main() {
let excutor = Executor::new();
excutor.block_on(tcp_server);
}
async fn tcp_server() {
let mut listener = TcpListener::bind("127.0.0.1:30000").unwrap();
println!("[tcp_server] listen on: 127.0.0.1:30000");
// NOTE:listener.next() 其实是调用的 poll_next()
while let Some(ret) = listener.next().await {
if let Ok((mut stream, addr)) = ret {
println!("[tcp_server] accept new connection: {}", addr);
// 此处只是注册,并不是此时执行
let future = async move {
let mut buf = [0; 4096];
loop {
match stream.read(&mut buf).await {
Ok(n) => {
println!("[tcp_server] stream {} read: {}", addr, n);
if n == 0 || stream.write_all(&buf[..n]).await.is_err() {
println!("[tcp_server] stream {} write: {}", addr, n);
return;
}
}
Err(e) => {
println!("[tcp_server] stream {} read: {}", addr, e);
return;
}
}
}
};
// 将 future 封装成 task push 到任务队列中
println!("[tcp_server] -> befor Executor::spawn()");
Executor::spawn(future);
println!("[tcp_server] -> after Executor::spawn()");
}
}
}
|