Skip to content

Commit ef40d88

Browse files
committed
Rewrite client example to modern async-std
1 parent da795de commit ef40d88

File tree

1 file changed

+27
-29
lines changed

1 file changed

+27
-29
lines changed

examples/a-chat/client.rs

+27-29
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,43 @@
1-
use futures::select;
2-
use futures::FutureExt;
1+
use std::sync::Arc;
32

43
use async_std::{
54
io::{stdin, BufReader},
65
net::{TcpStream, ToSocketAddrs},
76
prelude::*,
87
task,
8+
future::select,
99
};
1010

11+
1112
type Result<T> = std::result::Result<T, Box<dyn std::error::Error + Send + Sync>>;
1213

1314
pub(crate) fn main() -> Result<()> {
1415
task::block_on(try_main("127.0.0.1:8080"))
1516
}
1617

1718
async fn try_main(addr: impl ToSocketAddrs) -> Result<()> {
18-
let stream = TcpStream::connect(addr).await?;
19-
let (reader, mut writer) = (&stream, &stream);
20-
let reader = BufReader::new(reader);
21-
let mut lines_from_server = futures::StreamExt::fuse(reader.lines());
22-
23-
let stdin = BufReader::new(stdin());
24-
let mut lines_from_stdin = futures::StreamExt::fuse(stdin.lines());
25-
loop {
26-
select! {
27-
line = lines_from_server.next().fuse() => match line {
28-
Some(line) => {
29-
let line = line?;
30-
println!("{}", line);
31-
},
32-
None => break,
33-
},
34-
line = lines_from_stdin.next().fuse() => match line {
35-
Some(line) => {
36-
let line = line?;
37-
writer.write_all(line.as_bytes()).await?;
38-
writer.write_all(b"\n").await?;
39-
}
40-
None => break,
41-
}
42-
}
43-
}
44-
Ok(())
19+
let stream = Arc::new(TcpStream::connect(addr).await?);
20+
let (reader, writer) = (stream.clone(), stream.clone());
21+
22+
let incoming = task::spawn(async move {
23+
let mut messages = BufReader::new(&*reader).lines();
24+
while let Some(message) = messages.next().await {
25+
let message = message?;
26+
println!("{}", message);
27+
}
28+
Ok(())
29+
});
30+
31+
let outgoing = task::spawn(async move {
32+
let mut stdin = BufReader::new(stdin()).lines();
33+
34+
while let Some(line) = stdin.next().await {
35+
let line = line?;
36+
let message = format!("{}\n", line);
37+
(&*writer).write_all(message.as_bytes()).await?;
38+
}
39+
Ok(())
40+
});
41+
42+
select!(incoming, outgoing).await
4543
}

0 commit comments

Comments
 (0)