server/
server.rs

1// Crates ---------------------------------------------------------------------
2extern crate cobalt;
3
4
5// Dependencies ---------------------------------------------------------------
6use cobalt::{
7    BinaryRateLimiter, Config, NoopPacketModifier, MessageKind, UdpSocket,
8    Server, ServerEvent
9};
10
11fn main() {
12
13    // Create a new server that communicates over a udp socket
14    let mut server = Server::<
15        UdpSocket,
16        BinaryRateLimiter,
17        NoopPacketModifier
18
19    >::new(Config::default());
20
21    // Make the server listen on port `1234` on all interfaces.
22    println!("[Server] Listening...");
23    server.listen("0.0.0.0:1234").expect("Failed to bind to socket.");
24
25    'main: loop {
26
27        // Accept incoming connections and fetch their events
28        while let Ok(event) = server.accept_receive() {
29            // Handle events (e.g. Connection, Messages, etc.)
30            match event {
31                ServerEvent::Connection(id) => {
32                    let conn = server.connection(&id).unwrap();
33                    println!(
34                        "[Server] Client {} ({}, {}ms rtt) connected.",
35                        id.0,
36                        conn.peer_addr(),
37                        conn.rtt()
38                    );
39
40                },
41                ServerEvent::Message(id, message) => {
42                    let conn = server.connection(&id).unwrap();
43                    println!(
44                        "[Server] Message from client {} ({}, {}ms rtt): {:?}",
45                        id.0,
46                        conn.peer_addr(),
47                        conn.rtt(),
48                        message
49                    );
50
51                },
52                ServerEvent::ConnectionClosed(id, _) | ServerEvent::ConnectionLost(id, _) => {
53                    let conn = server.connection(&id).unwrap();
54                    println!(
55                        "[Server] Client {} ({}, {}ms rtt) disconnected.",
56                        id.0,
57                        conn.peer_addr(),
58                        conn.rtt()
59                    );
60                    break 'main;
61                },
62                _ => {}
63            }
64        }
65
66        // Send a message to all connected clients
67        for (_, conn) in server.connections() {
68            conn.send(MessageKind::Instant, b"Hello from Server".to_vec());
69        }
70
71        // Send all outgoing messages.
72        //
73        // Also auto delay the current thread to achieve the configured tick rate.
74        server.send(true).is_ok();
75
76    }
77
78    println!("[Server] Shutting down...");
79
80    // Shutdown the server (freeing its socket and closing all its connections)
81    server.shutdown().ok();
82
83}
84