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}