From 97568a29db5847b653a790869bf166b53b34e216 Mon Sep 17 00:00:00 2001 From: Horhik Date: Sun, 22 Nov 2020 16:31:45 +0200 Subject: [PATCH] start working with multithreading --- src/chat/#front_conn.rs# | 89 ++++++++++++++++++++++++++++++++++++++++ src/chat/front_conn.rs | 11 ++--- src/db/messaging.rs | 0 src/db/mod.rs | 4 ++ src/db/mod.rs~ | 4 ++ src/lib.rs | 1 + src/main.rs | 65 ++++++++++++++++++++++++++++- 7 files changed, 168 insertions(+), 6 deletions(-) create mode 100644 src/chat/#front_conn.rs# create mode 100644 src/db/messaging.rs create mode 100644 src/db/mod.rs create mode 100644 src/db/mod.rs~ diff --git a/src/chat/#front_conn.rs# b/src/chat/#front_conn.rs# new file mode 100644 index 0000000..470a90e --- /dev/null +++ b/src/chat/#front_conn.rs# @@ -0,0 +1,89 @@ +use crate::encrypting; +use crate::db; +use async_std::{ + io, + net::{TcpListener, TcpStream}, + task, +}; +use async_tungstenite::{accept_async, tungstenite::Message, WebSocketStream}; +use futures::{SinkExt, StreamExt}; +use serde_derive::Deserialize; +use std::env; +pub fn listen_client() -> io::Result<()> { + task::block_on(connect_to_client()) +} + +async fn connect_to_client() -> io::Result<()> { + let addr = env::args() + .nth(1) + .unwrap_or_else(|| "127.0.0.1:8080".to_string()); + + let listener = TcpListener::bind(&addr).await?; + + println!("Debugging!"); + while let Ok((stream, _)) = listener.accept().await { + task::spawn(accept_client(stream)); + } + + Ok(()) +} + +#[derive(Deserialize, Debug)] +struct FrontMsg { + userID: u32, + receiverID: u32, + message: String, + time: String, +} + +async fn accept_client(stream: TcpStream) -> io::Result<()> { + let addr = stream + .peer_addr() + .expect("connected streams should have a peer address"); + println!("Peer address: {}", addr); + + let ws = accept_async(stream) + .await + .expect("err during the ws handshake"); + + println!("connected to: {}", addr); + + let (mut sender, mut receiver) = ws.split(); + let mut new_msg = receiver.next(); + loop { + match new_msg.await { + Some(msg) => { + let jsoned = msg.unwrap(); + let res: serde_json::Result = + serde_json::from_str(jsoned.to_text().unwrap()); + if let Ok(received_msg) = res { + let id = received_msg.receiverID; + + /* message example + { + "userID": 123456789, + "receiverID": 123456789, + "message": "hey dude", + "time": "Tue Oct 13 2020 18:31:22 GMT+0300 (Eastern European Summer Time)", + + } + */ + sender + .send(Message::Text(String::from("Sended").to_owned())) + .await + .expect("ooops"); + } else { + println!("seems, that messsage formatted wrong"); + println!("{:?}", res); + } + + new_msg = receiver.next(); + } + None => { + break; + } + } + } + + Ok(()) +} diff --git a/src/chat/front_conn.rs b/src/chat/front_conn.rs index c773256..117a3ae 100644 --- a/src/chat/front_conn.rs +++ b/src/chat/front_conn.rs @@ -1,3 +1,4 @@ +use crate::db; use crate::encrypting; use async_std::{ io, @@ -19,10 +20,11 @@ async fn connect_to_client() -> io::Result<()> { let listener = TcpListener::bind(&addr).await?; + println!("Debugging!"); while let Ok((stream, _)) = listener.accept().await { task::spawn(accept_client(stream)); } - println!("HEY"); + println!("Debugging 2!"); Ok(()) } @@ -56,8 +58,7 @@ async fn accept_client(stream: TcpStream) -> io::Result<()> { let res: serde_json::Result = serde_json::from_str(jsoned.to_text().unwrap()); if let Ok(received_msg) = res { - let id = received_msg.receiverID; - println!("{:?}", id); + let msg = received_msg.message; /* message example { @@ -69,12 +70,12 @@ async fn accept_client(stream: TcpStream) -> io::Result<()> { } */ sender - .send(Message::Text(String::from("msg").to_owned())) + .send(Message::Text(String::from("Sended").to_owned())) .await .expect("ooops"); } else { println!("seems, that messsage formatted wrong"); - println!("{:?}", res); + println!("{:?}", res); } new_msg = receiver.next(); diff --git a/src/db/messaging.rs b/src/db/messaging.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/db/mod.rs b/src/db/mod.rs new file mode 100644 index 0000000..58719f2 --- /dev/null +++ b/src/db/mod.rs @@ -0,0 +1,4 @@ +pub mod messaging; +fn main () { + +} diff --git a/src/db/mod.rs~ b/src/db/mod.rs~ new file mode 100644 index 0000000..e438c2b --- /dev/null +++ b/src/db/mod.rs~ @@ -0,0 +1,4 @@ +pub mod messaging +fn main () { + +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 44a96f1..6ce714d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,5 @@ pub mod encrypting; +pub mod db; mod chat; pub use chat::front_conn; diff --git a/src/main.rs b/src/main.rs index e3f5866..6c9fe72 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,73 @@ mod chat; + +mod db; mod encrypting; use async_std::io; use chat::front_conn::listen_client; +use std::{ + sync::{ + mpsc, + mpsc::{Receiver, Sender}, + }, + thread, +}; fn main() -> io::Result<()> { - listen_client() + // listen_client(); + + enum ClientMessage { + Message(String), + Nope, + } + struct MFA{ + encoded_msg: String + // TODO add User field + }; //Message from above + + + struct ClientHandler { + message: ClientMessage, + } + + struct ServerHandler { + messages: Vec + } + + let (server_sender, server_receiver) : (Sender, Receiver) = mpsc::channel(); // server sender, server receiver + let (client_sender, client_receiver) : (Sender, Receiver) = mpsc::channel(); // client sender, client receiver + + let client_listener = thread::spawn(move || { + let a = server_receiver.recv(); + let it_will_drop = match a.message { + ClientMessage::Message(m) => { + println!("{}", &m); + m + }, + ClientMessage::Nope => String::from("fail!!"), + }; + server_sender.send(ClientHandler{message: ClientMessage::Message(String::from("I come from frontend"))}); + }); + + let server_listener = thread::spawn(move || loop { + let m1 = String::from("It's a encoded message from Jim"); + let m2 = String::from("It's a encoded message from one killer, who trying to find you"); + + let mut fromabove = ServerHandler{messages: vec![MFA(m1), MFA(m2)]}; + + for msg in fromabove.messages.iter() { + let msg = |MFA(lol)| ; + + } + + let mut a: ClientHandler = ClientHandler { + message: ClientMessage::Message(String::from("yup")), + } + let it_will_drop = match a.message { + ClientMessage::Message(m) => m, + ClientMessage::Nope => String::from("fail!!"), + }; + }); + Ok(()) } /* fn main() {