summaryrefslogtreecommitdiff
path: root/examples/tcp_async.rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/tcp_async.rs')
-rw-r--r--examples/tcp_async.rs72
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);
+ }
+ }
+}