diff options
author | natrixaeria <janng@gmx.de> | 2019-05-20 18:27:26 +0200 |
---|---|---|
committer | natrixaeria <janng@gmx.de> | 2019-05-20 18:27:26 +0200 |
commit | c7bc91ecd6c32afab52c5e45b569e3945bdd1056 (patch) | |
tree | 26010052a7b92ba56d59ddc7dadd515a2615c4ca /game_server/src | |
parent | 054a2bfe069ed4118d2f9fd1f01428632049057b (diff) |
Broadcast all text packets around clients
Diffstat (limited to 'game_server/src')
-rw-r--r-- | game_server/src/backend_connection.rs | 7 | ||||
-rw-r--r-- | game_server/src/group.rs | 1 | ||||
-rw-r--r-- | game_server/src/main.rs | 2 | ||||
-rw-r--r-- | game_server/src/scribble_group.rs | 29 | ||||
-rw-r--r-- | game_server/src/server.rs | 15 | ||||
-rw-r--r-- | 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<RequestData>, res_rec: Receiver<ResponseResult>, + 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<UserId, GameClient> + senders: Arc<Mutex<HashMap<UserId, ClientSender>>> } 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<<TcpStream as Splittable>::Reader>; +pub type ClientSender = sender::Writer<<TcpStream as Splittable>::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<GameClient, GameServerError>; 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 @@ <div id='cons'>connected</div><br> <button onclick='test_connection()'>Launch</button><br> <span>Server address: </span><input id='addr'></input> + <span>Message</span><input id='msg'></input><button onclick='send_text()'>Send</button> <div id='chat' style='background: rgb(20, 20, 20); padding-left: 20px; margin: 40px' /> </body> <script> @@ -22,7 +23,7 @@ function get_addr() { function test_connection() { let a = 'ws://' + get_addr(); add_text('create a new connection at "' + a + '"'); - const ws = new WebSocket(a, 'tuesday'); + ws = new WebSocket(a, 'tuesday'); ws.addEventListener('open', function (event) { add_text('connection established'); toggle_connected(true); @@ -42,6 +43,10 @@ function test_connection() { }); } +function send_text() { + ws.send(document.getElementById('msg').value); +} + function add_text(text, color='white') { let c = document.getElementById('chat'); let n = document.createElement('span'); |