From c7bc91ecd6c32afab52c5e45b569e3945bdd1056 Mon Sep 17 00:00:00 2001 From: natrixaeria Date: Mon, 20 May 2019 18:27:26 +0200 Subject: Broadcast all text packets around clients --- game_server/src/backend_connection.rs | 7 +++++-- game_server/src/group.rs | 1 - game_server/src/main.rs | 2 +- game_server/src/scribble_group.rs | 29 +++++++++++++++++++++-------- game_server/src/server.rs | 15 ++++++++++++--- game_server/src/ws_test.html | 7 ++++++- 6 files changed, 45 insertions(+), 16 deletions(-) diff --git a/game_server/src/backend_connection.rs b/game_server/src/backend_connection.rs index e1844ee..d32c58e 100644 --- a/game_server/src/backend_connection.rs +++ b/game_server/src/backend_connection.rs @@ -8,6 +8,7 @@ pub struct BackendConnection { host: String, req_sender: Sender, res_rec: Receiver, + max_uid: u32, } #[derive(Debug)] @@ -52,6 +53,7 @@ impl BackendConnection { host: host.to_string(), req_sender, res_rec, + max_uid: 420, } } @@ -63,18 +65,19 @@ impl BackendConnection { self.res_rec.recv().unwrap() } - pub fn validate_token(&self, token: &Token) -> TokenValidity { + pub fn validate_token(&mut self, token: &Token) -> TokenValidity { let location = format!("/api/lobby/tokens/{}", token); self.request(&location).map_err(|err| BackendError::UrlError(err))?; let response = self.get_response().map_err(|err| BackendError::RequestError(err))?; if response.status().is_success() { // zu Testzwecken werden noch keine JSON-Daten deserialisiert // Dennis Server gibt ja noch nix zurück + self.max_uid += 1; Ok(TokenResponse { group_id: 12, group_type: "scribble".to_string(), group_name: "Scribble".to_string(), - user_id: 420 + user_id: self.max_uid - 1, }) } else if response.status() == reqwest::StatusCode::NOT_FOUND { Err(BackendError::InvalidToken) diff --git a/game_server/src/group.rs b/game_server/src/group.rs index 6356a14..fcda12a 100644 --- a/game_server/src/group.rs +++ b/game_server/src/group.rs @@ -10,5 +10,4 @@ pub trait Group { fn run(&mut self); fn add_client(&mut self, id: UserId, client: GameClient); - fn get_client(&self, client_id: UserId) -> Option<&GameClient>; } diff --git a/game_server/src/main.rs b/game_server/src/main.rs index 8ff8f97..ab73a97 100644 --- a/game_server/src/main.rs +++ b/game_server/src/main.rs @@ -11,7 +11,7 @@ mod game_logger; fn main() { game_logger::init_logger(); - let addr = ("127.0.0.1", 5001); + let addr = ("0.0.0.0", 5001); info!("create game server on {:?}", addr); let mut gameserver = server::GameServer::new(addr); gameserver.run().unwrap(); diff --git a/game_server/src/scribble_group.rs b/game_server/src/scribble_group.rs index c240264..e68c6df 100644 --- a/game_server/src/scribble_group.rs +++ b/game_server/src/scribble_group.rs @@ -1,11 +1,13 @@ use super::group::{Group, GroupId}; -use super::server::{UserId, GameClient}; +use super::server::{UserId, GameClient, + ClientSender, ClientReceiver}; use std::collections::HashMap; +use std::sync::{Arc, Mutex}; pub struct ScribbleGroup { id: GroupId, name: String, - clients: HashMap + senders: Arc>> } impl Group for ScribbleGroup { @@ -27,16 +29,27 @@ impl Group for ScribbleGroup { fn add_client(&mut self, id: UserId, client: GameClient) { debug!("user {} joined the group {}:'{}'", id, self.id, self.name); - self.clients.insert(id, client); - } - - fn get_client(&self, client_id: UserId) -> Option<&GameClient> { - self.clients.get(&client_id) + let (sen, mut rec) = client.split(); + self.senders.lock().unwrap().insert(id, sen); + let senders_mutex = self.senders.clone(); + let self_uid = id; + std::thread::spawn(move || { + loop { + let message = rec.recv_message().unwrap(); + info!("got message: '{:?}'", message); + let mut senders = senders_mutex.lock().unwrap(); + for (uid, sender) in senders.iter_mut() { + if self_uid != *uid { + sender.send_message(&message); + } + } + } + }); } } impl ScribbleGroup { pub fn new(id: GroupId, name: String) -> Self { - Self { id, name, clients: HashMap::new() } + Self { id, name, senders: Arc::new(Mutex::new(HashMap::new())) } } } diff --git a/game_server/src/server.rs b/game_server/src/server.rs index c87594b..6294e2c 100644 --- a/game_server/src/server.rs +++ b/game_server/src/server.rs @@ -1,16 +1,20 @@ use websocket::{OwnedMessage, + stream::sync::Splittable, sync::Server, client::sync::Client, server::{NoTlsAcceptor, - sync::AcceptResult}}; + sync::AcceptResult}, + receiver, sender}; use std::net::{SocketAddr, ToSocketAddrs, TcpStream}; use std::sync::{mpsc, - mpsc::{Sender, Receiver}, - Arc, Mutex}; + mpsc::{Sender, Receiver}}; use std::collections::HashMap; use super::lobby::Lobby; use super::backend_connection::BackendConnection; +pub type ClientReceiver = receiver::Reader<::Reader>; +pub type ClientSender = sender::Writer<::Writer>; + const PROTOCOL: &str = "tuesday"; pub type Token = u32; @@ -59,6 +63,11 @@ impl GameClient { fn host_name(&self) -> SocketAddr { self.addr } + + pub fn split(self) -> (ClientSender, ClientReceiver) { + let (mut rec, mut sen) = self.client.split().unwrap(); + (sen, rec) + } } type ClientConnection = Result; diff --git a/game_server/src/ws_test.html b/game_server/src/ws_test.html index f802327..ee60b65 100644 --- a/game_server/src/ws_test.html +++ b/game_server/src/ws_test.html @@ -12,6 +12,7 @@
connected


Server address: + Message