summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornatrixaeria <janng@gmx.de>2019-05-17 20:59:10 +0200
committernatrixaeria <janng@gmx.de>2019-05-17 20:59:10 +0200
commit921d023a7652be5b1232ac41aeb2646b5f83ceb5 (patch)
treea68af6379f51421a576bffa16f066b31895449ad
parent2f9e5dfaac05538fdf4513569b4df6872ee85b89 (diff)
Add WebSocket server functionality
and a WebSocket javascript test suite
-rwxr-xr-xgame_server/build.sh6
-rw-r--r--game_server/src/gameserver.rs44
-rw-r--r--game_server/src/main.rs14
-rw-r--r--game_server/src/ws_test.html65
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>