demo_async_tcp/
demo-async-tcp.rs

1use rndz::tcp::AsyncClient;
2use rndz::tcp::Server;
3use std::error::Error;
4use std::time::Duration;
5use tokio::{
6    io::{AsyncReadExt, AsyncWriteExt},
7    task::spawn,
8    time::sleep,
9};
10
11#[tokio::main]
12async fn main() -> Result<(), Box<dyn Error>> {
13    let server_addr = "127.0.0.1:8888";
14
15    {
16        let server_addr = server_addr.clone();
17        spawn(async move { Server::new(server_addr).await?.run().await });
18    }
19
20    let t = {
21        let server_addr = server_addr.clone();
22        spawn(async move {
23            let mut c = AsyncClient::new(server_addr, "c1", None).unwrap();
24            loop {
25                match c.listen().await {
26                    Ok(_) => {
27                        let (mut s, _) = c.accept().await.unwrap();
28                        s.write(b"hello").await.unwrap();
29                        break;
30                    }
31                    _ => {
32                        sleep(Duration::from_secs(1)).await;
33                        continue;
34                    }
35                }
36            }
37        })
38    };
39
40    let mut c = AsyncClient::new(server_addr, "c2", None)?;
41    let mut s = loop {
42        match c.connect("c1").await {
43            Ok(s) => break s,
44            _ => sleep(Duration::from_secs(1)).await,
45        }
46    };
47
48    let mut buf = [0u8; 5];
49    s.read(&mut buf).await?;
50
51    t.await?;
52
53    Ok(())
54}