net.rs (2514B)
1 use std::{ 2 collections::LinkedList, 3 sync::{ 4 Arc, Mutex, 5 mpsc::{Receiver, Sender, channel}, 6 }, 7 thread::{self, JoinHandle}, 8 time::Duration, 9 }; 10 11 use common::{ 12 game::{Action, Response}, 13 net::{handle_network_read, handle_network_write}, 14 }; 15 use mio::{ 16 Events, Interest, Poll, Token, 17 net::{TcpListener, TcpStream}, 18 }; 19 use uuid::Uuid; 20 21 const TOKEN: Token = Token(0); 22 23 #[derive(Debug)] 24 pub(crate) struct Client { 25 pub(crate) id: Option<Uuid>, 26 pub(crate) thread: JoinHandle<()>, 27 pub(crate) tx: Sender<Response>, 28 pub(crate) sequence_number: u32, 29 } 30 31 impl Client { 32 fn new( 33 stream: TcpStream, 34 client_to_main_tx: Sender<Action>, 35 main_to_client_tx: Sender<Response>, 36 main_to_client_rx: Receiver<Response>, 37 ) -> Self { 38 Client { 39 id: None, 40 thread: thread::spawn(|| handle_client(stream, main_to_client_rx, client_to_main_tx)), 41 tx: main_to_client_tx, 42 sequence_number: 0, 43 } 44 } 45 } 46 47 pub(crate) fn listen(clients: Arc<Mutex<LinkedList<Client>>>, tx: Sender<Action>) { 48 let mut poll = Poll::new().unwrap(); 49 let mut events = Events::with_capacity(128); 50 let mut listener = TcpListener::bind("0.0.0.0:6767".parse().unwrap()).unwrap(); 51 poll.registry() 52 .register(&mut listener, TOKEN, Interest::READABLE) 53 .unwrap(); 54 loop { 55 poll.poll(&mut events, None).unwrap(); 56 for _ in events.iter() { 57 let (stream, _addr) = listener.accept().unwrap(); 58 let (main_to_client_tx, main_to_client_rx) = channel(); 59 clients.lock().unwrap().push_back(Client::new( 60 stream, 61 tx.clone(), 62 main_to_client_tx, 63 main_to_client_rx, 64 )); 65 } 66 } 67 } 68 69 fn handle_client(mut stream: TcpStream, rx: Receiver<Response>, tx: Sender<Action>) { 70 let poll = Poll::new().unwrap(); 71 poll.registry() 72 .register(&mut stream, TOKEN, Interest::READABLE) 73 .unwrap(); 74 let shared_stream = Arc::new(Mutex::new(stream)); 75 let shared_stream_read = shared_stream.clone(); 76 let shared_stream_write = shared_stream.clone(); 77 let read_thread = thread::spawn(|| handle_network_read(poll, shared_stream_read, tx)); 78 let write_thread = thread::spawn(|| handle_network_write(shared_stream_write, rx)); 79 while !read_thread.is_finished() && !write_thread.is_finished() { 80 thread::sleep(Duration::from_millis(500)); 81 } 82 }