setting up json based message protocol

This commit is contained in:
michael-bailey 2021-03-18 11:50:12 +00:00
parent 19832f0aa1
commit b53a63fd54
1 changed files with 24 additions and 26 deletions

View File

@ -1,20 +1,21 @@
pub mod client_management;
use std::collections::HashMap;
use std::io::BufWriter;
use std::io::BufReader;
use std::net::TcpListener;
use std::sync::Arc;
use std::io::Write;
use std::io::Read;
use std::io::BufRead;
use uuid::Uuid;
use crossbeam_channel::{Sender, Receiver, unbounded};
use serde::{Serialize, Deserialize};
use crate::lib::server::client_management::ClientManager;
use crate::lib::server::client_management::traits::TClientManager;
use crate::lib::Foundation::{ICooperative};
use client_management::client::Client;
use crate::lib::commands::Commands;
/// # ServerMessages
/// This is used internally
@ -24,6 +25,13 @@ pub enum ServerMessages {
ClientDisconnected(Uuid)
}
#[derive(Serialize, Deserialize, Debug)]
pub enum ServerSocketMessages {
Request,
Info,
Connect {uuid: Uuid, username: String, address: String}
}
pub struct Server {
server_socket: TcpListener,
client_manager: Arc<ClientManager>,
@ -54,35 +62,25 @@ impl Server {
impl ICooperative for Server{
fn tick(&self) {
let mut buffer = vec![0; 64];
let mut buffer = String::new();
// handle new connections
for connection in self.server_socket.incoming() {
match connection {
Ok(mut stream) => {
stream.write_all(Commands::Request(None).to_string().as_bytes()).expect("error writing socket");
stream.read_to_end(&mut buffer).expect("error reading sokcet");
println!("buffer: {:?}", &buffer);
let (mut reader, mut writer) = match connection {
Ok(mut stream) => (BufReader::new(stream.try_clone().unwrap()), BufWriter::new(stream.try_clone().unwrap())),
Err(_) => break,
};
let command = Commands::from(&mut buffer);
writer.write_all(serde_json::to_string(&ServerSocketMessages::Request).unwrap().as_bytes());
writer.flush();
match command {
Commands::Info(None) => {
let server_config = vec![
("name".to_string(), "Test server".to_string())
];
let map: HashMap<String, String> = server_config.into_iter().collect();
stream.write_all(Commands::Success(Some(map)).to_string().as_bytes())
.expect("error sending response");
}
Commands::Connect(Some(map)) => println!("connect command: {:?}", &map),
reader.read_line(&mut buffer);
_ => {let _ = stream.write("not implemented!".as_bytes());}
}
},
_ => println!("!connection error occured!"),
}
println!("recieved: {:?}", &buffer);
let msg: ServerSocketMessages = serde_json::from_str(&buffer).unwrap();
println!("got msg: {:?}", msg)
}
// handle new messages loop