Skip to content

Commit 177c1b6

Browse files
committed
Rewrite server
1 parent ef40d88 commit 177c1b6

File tree

1 file changed

+21
-20
lines changed

1 file changed

+21
-20
lines changed

examples/a-chat/server.rs

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,17 @@ use std::{
33
sync::Arc,
44
};
55

6-
use futures::{channel::mpsc, select, FutureExt, SinkExt};
6+
use futures::{select, FutureExt};
77

88
use async_std::{
99
io::BufReader,
1010
net::{TcpListener, TcpStream, ToSocketAddrs},
1111
prelude::*,
1212
task,
13+
sync::{channel, Sender, Receiver},
1314
};
1415

1516
type Result<T> = std::result::Result<T, Box<dyn std::error::Error + Send + Sync>>;
16-
type Sender<T> = mpsc::UnboundedSender<T>;
17-
type Receiver<T> = mpsc::UnboundedReceiver<T>;
1817

1918
#[derive(Debug)]
2019
enum Void {}
@@ -26,7 +25,7 @@ pub(crate) fn main() -> Result<()> {
2625
async fn accept_loop(addr: impl ToSocketAddrs) -> Result<()> {
2726
let listener = TcpListener::bind(addr).await?;
2827

29-
let (broker_sender, broker_receiver) = mpsc::unbounded();
28+
let (broker_sender, broker_receiver) = channel(10);
3029
let broker = task::spawn(broker_loop(broker_receiver));
3130
let mut incoming = listener.incoming();
3231
while let Some(stream) = incoming.next().await {
@@ -39,7 +38,7 @@ async fn accept_loop(addr: impl ToSocketAddrs) -> Result<()> {
3938
Ok(())
4039
}
4140

42-
async fn connection_loop(mut broker: Sender<Event>, stream: TcpStream) -> Result<()> {
41+
async fn connection_loop(broker: Sender<Event>, stream: TcpStream) -> Result<()> {
4342
let stream = Arc::new(stream);
4443
let reader = BufReader::new(&*stream);
4544
let mut lines = reader.lines();
@@ -48,15 +47,14 @@ async fn connection_loop(mut broker: Sender<Event>, stream: TcpStream) -> Result
4847
None => return Err("peer disconnected immediately".into()),
4948
Some(line) => line?,
5049
};
51-
let (_shutdown_sender, shutdown_receiver) = mpsc::unbounded::<Void>();
50+
let (_shutdown_sender, shutdown_receiver) = channel::<Void>(0);
5251
broker
5352
.send(Event::NewPeer {
5453
name: name.clone(),
5554
stream: Arc::clone(&stream),
5655
shutdown: shutdown_receiver,
5756
})
58-
.await
59-
.unwrap();
57+
.await;
6058

6159
while let Some(line) = lines.next().await {
6260
let line = line?;
@@ -76,8 +74,7 @@ async fn connection_loop(mut broker: Sender<Event>, stream: TcpStream) -> Result
7674
to: dest,
7775
msg,
7876
})
79-
.await
80-
.unwrap();
77+
.await;
8178
}
8279

8380
Ok(())
@@ -115,23 +112,23 @@ enum Event {
115112
from: String,
116113
to: Vec<String>,
117114
msg: String,
118-
},
115+
}
119116
}
120117

121118
async fn broker_loop(mut events: Receiver<Event>) {
122119
let (disconnect_sender, mut disconnect_receiver) =
123-
mpsc::unbounded::<(String, Receiver<String>)>();
120+
channel::<(String, Receiver<String>)>(2);
124121
let mut peers: HashMap<String, Sender<String>> = HashMap::new();
125122

126123
loop {
124+
127125
let event = select! {
128-
event = events.next().fuse() => match event {
126+
event = events.next() => match event {
129127
None => break,
130128
Some(event) => event,
131129
},
132-
disconnect = disconnect_receiver.next().fuse() => {
130+
disconnect = disconnect_receiver.next() => {
133131
let (name, _pending_messages) = disconnect.unwrap();
134-
assert!(peers.remove(&name).is_some());
135132
continue;
136133
},
137134
};
@@ -140,7 +137,7 @@ async fn broker_loop(mut events: Receiver<Event>) {
140137
for addr in to {
141138
if let Some(peer) = peers.get_mut(&addr) {
142139
let msg = format!("from {}: {}\n", from, msg);
143-
peer.send(msg).await.unwrap();
140+
peer.send(msg).await;
144141
}
145142
}
146143
}
@@ -151,20 +148,24 @@ async fn broker_loop(mut events: Receiver<Event>) {
151148
} => match peers.entry(name.clone()) {
152149
Entry::Occupied(..) => (),
153150
Entry::Vacant(entry) => {
154-
let (client_sender, mut client_receiver) = mpsc::unbounded();
151+
let (client_sender, mut client_receiver) = channel(10);
155152
entry.insert(client_sender);
156-
let mut disconnect_sender = disconnect_sender.clone();
153+
let disconnect_sender = disconnect_sender.clone();
157154
spawn_and_log_error(async move {
158155
let res =
159156
connection_writer_loop(&mut client_receiver, stream, shutdown).await;
160157
disconnect_sender
161158
.send((name, client_receiver))
162-
.await
163-
.unwrap();
159+
.await;
164160
res
165161
});
166162
}
167163
},
164+
Event::Disconnect {
165+
name
166+
} => {
167+
assert!(peers.remove(&name).is_some());
168+
}
168169
}
169170
}
170171
drop(peers);

0 commit comments

Comments
 (0)