diff options
author | natrixaeria <janng@gmx.de> | 2019-05-17 20:59:10 +0200 |
---|---|---|
committer | natrixaeria <janng@gmx.de> | 2019-05-17 20:59:10 +0200 |
commit | 921d023a7652be5b1232ac41aeb2646b5f83ceb5 (patch) | |
tree | a68af6379f51421a576bffa16f066b31895449ad | |
parent | 2f9e5dfaac05538fdf4513569b4df6872ee85b89 (diff) |
Add WebSocket server functionality
and a WebSocket javascript test suite
-rwxr-xr-x | game_server/build.sh | 6 | ||||
-rw-r--r-- | game_server/src/gameserver.rs | 44 | ||||
-rw-r--r-- | game_server/src/main.rs | 14 | ||||
-rw-r--r-- | game_server/src/ws_test.html | 65 |
4 files changed, 122 insertions, 7 deletions
diff --git a/game_server/build.sh b/game_server/build.sh index 5929e29..1eb61a1 100755 --- a/game_server/build.sh +++ b/game_server/build.sh @@ -2,9 +2,9 @@ case $1 in ("") - if rustup run nightly cargo --color always build; then + if rustup run stable cargo --color always build; then echo build success! - RUST_LOG=info target/debug/game-server + RUST_LOG=debug target/debug/game-server else echo build failed! fi @@ -13,7 +13,7 @@ case $1 in sh build.sh &> err && cat err | tac ;; -c) - rustup run nightly cargo clean + rustup run stable cargo clean ;; *) echo invalid argument diff --git a/game_server/src/gameserver.rs b/game_server/src/gameserver.rs index e69de29..6bc3e07 100644 --- a/game_server/src/gameserver.rs +++ b/game_server/src/gameserver.rs @@ -0,0 +1,44 @@ +use websocket::{OwnedMessage, sync::Server, server::NoTlsAcceptor}; +use std::net::{SocketAddr, ToSocketAddrs}; +use std::sync::mpsc; +use std::sync::mpsc::{Sender, Receiver}; + +#[derive(Debug)] +pub enum GameServerError { + BindError(std::io::Error), +} + +type ClientConnection = Result<(), GameServerError>; + +pub struct GameServer { + addr: SocketAddr, + rec: Receiver<ClientConnection>, +} + +impl GameServer { + pub fn new<T: ToSocketAddrs>(addr: T) -> Self { + let (s, r): (Sender<ClientConnection>, Receiver<ClientConnection>) + = mpsc::channel(); + let addr = addr.to_socket_addrs().unwrap().next().unwrap(); + debug!("ws address: {}", addr); + std::thread::spawn(move || { + let server = match Server::<NoTlsAcceptor>::bind(addr) { + Ok(v) => v, + Err(e) => { + s.send(Err(GameServerError::BindError(e))).unwrap(); + return; + }, + }; + info!("webserver is being launched"); + for req in server { + //println!("{:?}", req); + println!("gotcha"); + } + info!("webserver is being shut down"); + }); + GameServer { + addr, + rec: r, + } + } +} diff --git a/game_server/src/main.rs b/game_server/src/main.rs index f7a1085..2d261d8 100644 --- a/game_server/src/main.rs +++ b/game_server/src/main.rs @@ -1,27 +1,33 @@ mod group; mod test_group; mod lobby; +mod gameserver; mod backend_connection; #[macro_use] extern crate log; use pretty_env_logger; -use test_group::TestGroup; use lobby::Lobby; use backend_connection::BackendConnection; fn main() { pretty_env_logger::init(); + info!("create lobby"); let mut lobby = Lobby::new(); + let addr = ("127.0.0.1", 5001); + info!("create game server on {:?}", addr); + let gameserver = gameserver::GameServer::new(addr); for group in lobby.iter() { group.run() } - let mut backend = BackendConnection::new("http://129.13.215.68:5000"); + let mut backend = BackendConnection::new("https://kobert.dev"); loop { - backend.request("/scribble").unwrap(); - println!("{:?}", backend.get_response()); + std::thread::sleep(std::time::Duration::from_millis(1000)); + + //backend.request("/api/lobby/tokens/1230").unwrap(); + //println!("{:?}", backend.get_response()); } } diff --git a/game_server/src/ws_test.html b/game_server/src/ws_test.html new file mode 100644 index 0000000..29d4d50 --- /dev/null +++ b/game_server/src/ws_test.html @@ -0,0 +1,65 @@ +<!doctype html> +<html> + <head> + <title>WS Test</title> + <style> +.b { + border-bottom: 1px solid black; +} + </style> + </head> + <body style='background: black; color: white'> + <div id='cons'>connected</div><br> + <button onclick='test_connection()'>Launch</button><br> + <span>Server address: </span><input id='addr'></input> + <div id='chat' style='background: rgb(20, 20, 20); padding-left: 20px; margin: 40px' /> + </body> + <script> +function get_addr() { + return document.getElementById('addr').value; +} + +function test_connection() { + let a = 'ws://' + get_addr(); + add_text('create a new connection at "' + a + '"'); + const ws = new WebSocket(a); + ws.addEventListener('open', function (event) { + add_text('connection established'); + toggle_connected(true); + }); + ws.addEventListener('error', function (event) { + add_text('ws error occured: "' + event + '"'); + toggle_connected(false); + }); + ws.addEventListener('close', function (event) { + add_text('ws is closed now'); + toggle_connected(false); + }); + ws.addEventListener('message', function (event) { + add_text('got ws message: ' + event); + }); +} + +function add_text(text, color='white') { + let c = document.getElementById('chat'); + let n = document.createElement('span'); + n.setAttribute('class', 'b'); + n.style = 'color: ' + color; + n.textContent = (new Date()).toTimeString().substring(0, 8) + '|> '+ text; + c.appendChild(n); + c.appendChild(document.createElement('br')); +} +function toggle_connected(con) { + let c = document.getElementById('cons'); + if (con) { + c.style = 'background: green' + c.textContent = 'connected'; + } else { + c.style = 'background: red' + c.textContent = 'not connected'; + } +} +toggle_connected(false); +add_text("JS loaded"); + </script> +</html> |