summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornatrixaeria <janng@gmx.de>2019-05-20 18:27:26 +0200
committernatrixaeria <janng@gmx.de>2019-05-20 18:27:26 +0200
commitc7bc91ecd6c32afab52c5e45b569e3945bdd1056 (patch)
tree26010052a7b92ba56d59ddc7dadd515a2615c4ca
parent054a2bfe069ed4118d2f9fd1f01428632049057b (diff)
Broadcast all text packets around clients
-rw-r--r--game_server/src/backend_connection.rs7
-rw-r--r--game_server/src/group.rs1
-rw-r--r--game_server/src/main.rs2
-rw-r--r--game_server/src/scribble_group.rs29
-rw-r--r--game_server/src/server.rs15
-rw-r--r--game_server/src/ws_test.html7
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');