< 返回版块

py-162157 发表于 2020-09-18 14:43

Tags:TCP, async, server

use tokio::io::{self, AsyncReadExt, AsyncWriteExt}; use tokio::net::{TcpStream, TcpListener};

#[tokio::main] async fn main() -> io::Result<()> { let mut listener = TcpListener::bind("127.0.0.1:6142").await.unwrap(); let socket = TcpStream::connect("127.0.0.1:6142").await.unwrap(); let (mut rd, mut wr) = socket.into_split(); wr.write_all(b"message from 127.0.0.1!").await; let (mut socket, address) = listener.accept().await?;

tokio::spawn(async move {
    let mut buf = vec![0;1024];
    println!("the address connected is: {}", address);
        
    loop {
        match socket.read(&mut buf).await {
            Ok(0) => return,
            Ok(n) => {
                if socket.write_all(&buf[..n]).await.is_err() {
                    return;
                }
            }
            Err(_) => {
                return;
            }
        }
    }
});

tokio::spawn(async move {
    let mut buffer = String::new();

    loop {
        match rd.read_to_string(&mut buffer).await {
            Ok(0) => return,
            Ok(_n) => println!("The received message's context is:{}", buffer),
            Err(_) => {
                println!("Error happened!");
                return;
            },
        }
    }
});
Ok::<_, io::Error>(())

}

dependancies信息为: tokio = { version = "0.2.22", features = ["full"] }

以上是我的设计的一个简单的tcp的server,想实现回声功能,编译已经通过了,但是不print收到的信息。单步调试过程中我发现代码运行到第35行,再点下一步就直接结束了,不知道为什么,感觉也没什么逻辑错误啊。而且查看到rd的接收队列是确实收到了信息的,求大佬解答一下。

评论区

写评论
puzc1993 2020-09-18 16:39

--
👇
puzc1993: tokio::spawn(async move { let mut buffer = vec![0; 1024];

    loop {
        match rd.read(&mut buffer).await {
            Ok(0) => return,
            Ok(n) => println!(
                "The received message's context is:{}",
                String::from_utf8_lossy(&buffer[..n])
            ),
            Err(_) => {
                println!("Error happened!");
                return;
            }
        }
    }
});

关键在这行: rd.read_to_string(&mut buffer).await

你把buffer改成Vec, 并使用rd.read(&mut buffer).await后就可以接收到数据了。 记得在Ok::<_, io::Error>(())之前再加一行thread::sleep, 不然进程会立即结束,看不到输出

puzc1993 2020-09-18 16:35

tokio::spawn(async move { let mut buffer = vec![0; 1024];

    loop {
        match rd.read(&mut buffer).await {
            Ok(0) => return,
            Ok(n) => println!(
                "The received message's context is:{}",
                String::from_utf8_lossy(&buffer[..n])
            ),
            Err(_) => {
                println!("Error happened!");
                return;
            }
        }
    }
});

关键在这行: rd.read_to_string(&mut buffer).await

你把buffer改成Vec, 并使用rd.read(&mut buffer).await后就可以接收到数据了

作者 py-162157 2020-09-18 15:42

谢谢,刚学异步编程确实还没掌握到精髓

--
👇
gwy15: 问题有两个,一个是你的 server 的 handler 没有 await,所以直接结束了; 另一个是你 accept 的时候还没有发送请求,所以 block 住了。

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=0de3a0586769b0b000319e1f097dd9d1

给你改好了

gwy15 2020-09-18 15:15

问题有两个,一个是你的 server 的 handler 没有 await,所以直接结束了; 另一个是你 accept 的时候还没有发送请求,所以 block 住了。

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=0de3a0586769b0b000319e1f097dd9d1

给你改好了

1 共 4 条评论, 1 页