diff options
Diffstat (limited to 'examples/tcp_async.rs')
| -rw-r--r-- | examples/tcp_async.rs | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/examples/tcp_async.rs b/examples/tcp_async.rs new file mode 100644 index 0000000..50c5ed6 --- /dev/null +++ b/examples/tcp_async.rs @@ -0,0 +1,72 @@ +//! Echo example. +//! Use `nc 127.0.0.1 30000` to connect. + +use futures::StreamExt; +use mini_rust_runtime::executor::Executor; +use mini_rust_runtime::net::tcp::TcpListener; +use tokio::io::{AsyncReadExt, AsyncWriteExt}; + +fn main() { + let ex = Executor::new(); // 执行器实例 + ex.block_on(test); // 协程最开始的地方 +} + +async fn test(){ + let test1 = serve; + let test2= serve2; + // 并发执行 test1 test2 + let ((),()) = futures::join!(test1(), test2()); +} + +async fn serve2(){ + let mut listener2 = TcpListener::bind("127.0.0.1:30001").unwrap(); // 绑定地址:端口 + while let Some(ret) = listener2.next().await { // 等待下一个 Tcp 连接 + // 如果 tcp 建立连接成功, 取 stream 和 addr + if let Ok((mut stream, addr)) = ret { + println!("accept a new connection from {} successfully", addr); + let f = async move { + let mut buf = [0; 4096]; + loop { + match stream.read(&mut buf).await { + Ok(n) => { + if n == 0 || stream.write_all(&buf[..n]).await.is_err() { + // 回写 + return; + } + } + Err(_) => { + return; + } + } + } + }; + Executor::spawn(f); + } + } +} + +async fn serve() { + let mut listener = TcpListener::bind("127.0.0.1:30000").unwrap(); // 绑定地址:端口 + while let Some(ret) = listener.next().await { + if let Ok((mut stream, addr)) = ret { + println!("accept a new connection from {} successfully", addr); + let f = async move { + let mut buf = [0; 4096]; + loop { + match stream.read(&mut buf).await { + Ok(n) => { + if n == 0 || stream.write_all(&buf[..n]).await.is_err() { + // 回写 + return; + } + } + Err(_) => { + return; + } + } + } + }; + Executor::spawn(f); + } + } +} |
