-
Notifications
You must be signed in to change notification settings - Fork 71
/
server_client.rs
109 lines (86 loc) · 2.98 KB
/
server_client.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
//! Note that the terms "client" and "server" here are purely what we logically associate with them.
//! Technically, they both work the same.
//! Note that in practice you don't want to implement a chat client using UDP.
use std::io::stdin;
use std::thread;
use std::time::Instant;
use laminar::{ErrorKind, Packet, Socket, SocketEvent};
const SERVER: &str = "127.0.0.1:12351";
fn server() -> Result<(), ErrorKind> {
let mut socket = Socket::bind(SERVER)?;
let (sender, receiver) = (socket.get_packet_sender(), socket.get_event_receiver());
let _thread = thread::spawn(move || socket.start_polling());
loop {
if let Ok(event) = receiver.recv() {
match event {
SocketEvent::Packet(packet) => {
let msg = packet.payload();
if msg == b"Bye!" {
break;
}
let msg = String::from_utf8_lossy(msg);
let ip = packet.addr().ip();
println!("Received {:?} from {:?}", msg, ip);
sender
.send(Packet::reliable_unordered(
packet.addr(),
"Copy that!".as_bytes().to_vec(),
))
.expect("This should send");
}
SocketEvent::Timeout(address) => {
println!("Client timed out: {}", address);
}
_ => {}
}
}
}
Ok(())
}
fn client() -> Result<(), ErrorKind> {
let addr = "127.0.0.1:12352";
let mut socket = Socket::bind(addr)?;
println!("Connected on {}", addr);
let server = SERVER.parse().unwrap();
println!("Type a message and press Enter to send. Send `Bye!` to quit.");
let stdin = stdin();
let mut s_buffer = String::new();
loop {
s_buffer.clear();
stdin.read_line(&mut s_buffer)?;
let line = s_buffer.replace(|x| x == '\n' || x == '\r', "");
socket.send(Packet::reliable_unordered(
server,
line.clone().into_bytes(),
))?;
socket.manual_poll(Instant::now());
if line == "Bye!" {
break;
}
match socket.recv() {
Some(SocketEvent::Packet(packet)) => {
if packet.addr() == server {
println!("Server sent: {}", String::from_utf8_lossy(packet.payload()));
} else {
println!("Unknown sender.");
}
}
Some(SocketEvent::Timeout(_)) => {}
_ => println!("Silence.."),
}
}
Ok(())
}
fn main() -> Result<(), ErrorKind> {
let stdin = stdin();
println!("Please type in `server` or `client`.");
let mut s = String::new();
stdin.read_line(&mut s)?;
if s.starts_with('s') {
println!("Starting server..");
server()
} else {
println!("Starting client..");
client()
}
}