blizzard_server/server/
mod.rs1mod connector;
7pub mod controller;
8mod pool;
9
10use std::io::{Error, Read, Write};
11use std::net::{TcpListener, TcpStream};
12use std::sync::mpsc::Receiver;
13use std::sync::{Arc, Mutex};
14
15use serde::de::DeserializeOwned;
16use serde::Serialize;
17
18use blizzard_engine::game::Game;
19
20use pool::Pool;
21
22pub struct Server {}
27
28impl Server {
29    pub fn new<T: Game<K, I>, K, I, M>(
31        port: i32,
32        max_games: i32,
33        max_players: i32,
34        game: T,
35        shared_state: K,
36        input: I,
37        handle_input: &'static (dyn Fn(Receiver<(M, usize)>, Arc<Mutex<I>>) -> I + Sync),
38        send_data_rate: i32,
39        game_update_rate: i32,
40    ) where
41        T: Clone + Send + 'static,
42        K: Clone + Send + Serialize + 'static,
43        I: Send + Copy,
44        M: Send + DeserializeOwned,
45    {
46        let game_pool = Pool::new(
48            max_games,
49            max_players,
50            game,
51            shared_state,
52            input,
53            handle_input,
54            send_data_rate,
55            game_update_rate,
56        );
57
58        let tcp = format!("0.0.0.0:{}", port);
60
61        let listener = TcpListener::bind(tcp).expect("Could not bind");
63
64        for stream in listener.incoming() {
66            match stream {
67                Err(e) => {
68                    eprintln!("failed: {}", e)
69                }
70                Ok(stream) => {
71                    if let Some(game_wrapper_port) = game_pool.find_empty_game() {
73                        Server::handle_client_connection(stream, game_wrapper_port)
74                            .unwrap_or_else(|error| eprintln!("{:?}", error));
75                    } else {
76                        Server::handle_client_connection(stream, 0)
77                            .unwrap_or_else(|error| eprintln!("{:?}", error));
78                    }
79                }
80            }
81        }
82    }
83
84    fn handle_client_connection(mut stream: TcpStream, port: i32) -> Result<(), Error> {
90        println!("Incoming connection from: {}", stream.peer_addr()?);
91        let mut buf = [0; 512];
92        loop {
93            let bytes_read = stream.read(&mut buf)?;
94            if bytes_read == 0 {
95                return Ok(());
96            }
97            let port: String = format!("{}\n", port);
98            stream.write(port.as_bytes()).unwrap();
99            stream.flush().unwrap();
100        }
101    }
102}