|
1 |
| -use futures::select; |
2 |
| -use futures::FutureExt; |
| 1 | +use std::sync::Arc; |
3 | 2 |
|
4 | 3 | use async_std::{
|
5 | 4 | io::{stdin, BufReader},
|
6 | 5 | net::{TcpStream, ToSocketAddrs},
|
7 | 6 | prelude::*,
|
8 | 7 | task,
|
| 8 | + future::select, |
9 | 9 | };
|
10 | 10 |
|
| 11 | + |
11 | 12 | type Result<T> = std::result::Result<T, Box<dyn std::error::Error + Send + Sync>>;
|
12 | 13 |
|
13 | 14 | pub(crate) fn main() -> Result<()> {
|
14 | 15 | task::block_on(try_main("127.0.0.1:8080"))
|
15 | 16 | }
|
16 | 17 |
|
17 | 18 | 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 |
45 | 43 | }
|
0 commit comments