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: tokio::spawn(async move { let mut buffer = vec![0; 1024];
关键在这行: rd.read_to_string(&mut buffer).await
你把buffer改成Vec, 并使用rd.read(&mut buffer).await后就可以接收到数据了。 记得在Ok::<_, io::Error>(())之前再加一行thread::sleep, 不然进程会立即结束,看不到输出
tokio::spawn(async move { let mut buffer = vec![0; 1024];
关键在这行: rd.read_to_string(&mut buffer).await
你把buffer改成Vec, 并使用rd.read(&mut buffer).await后就可以接收到数据了
谢谢,刚学异步编程确实还没掌握到精髓
--
👇
gwy15: 问题有两个,一个是你的 server 的 handler 没有 await,所以直接结束了; 另一个是你 accept 的时候还没有发送请求,所以 block 住了。
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=0de3a0586769b0b000319e1f097dd9d1
给你改好了
问题有两个,一个是你的 server 的 handler 没有 await,所以直接结束了; 另一个是你 accept 的时候还没有发送请求,所以 block 住了。
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=0de3a0586769b0b000319e1f097dd9d1
给你改好了