summaryrefslogtreecommitdiff
path: root/client/src/network.rs
diff options
context:
space:
mode:
Diffstat (limited to 'client/src/network.rs')
-rw-r--r--client/src/network.rs55
1 files changed, 55 insertions, 0 deletions
diff --git a/client/src/network.rs b/client/src/network.rs
new file mode 100644
index 0000000..0fd5f08
--- /dev/null
+++ b/client/src/network.rs
@@ -0,0 +1,55 @@
+use std::{
+ io::{BufReader, BufWriter},
+ net::TcpStream,
+ sync::mpsc::{Receiver, Sender, channel},
+ thread::spawn,
+};
+
+use anyhow::Result;
+use log::{debug, info, warn};
+use weareshared::packets::Packet;
+
+pub struct Network {
+ pub packet_recv: Receiver<Packet>,
+ pub packet_send: Sender<Packet>,
+}
+impl Network {
+ pub fn new(sock: TcpStream) -> Self {
+ info!("starting network threads");
+ let (packet_send, rx) = channel();
+ let (tx, packet_recv) = channel();
+
+ let sock2 = sock.try_clone().unwrap();
+ spawn(move || {
+ if let Err(e) = handle_conn_read(sock, tx) {
+ warn!("read thread: {e:?}")
+ }
+ });
+ spawn(move || {
+ if let Err(e) = handle_conn_write(sock2, rx) {
+ warn!("write thread: {e:?}")
+ }
+ });
+ Self {
+ packet_recv,
+ packet_send,
+ }
+ }
+}
+
+fn handle_conn_read(sock: TcpStream, tx: Sender<Packet>) -> Result<()> {
+ let mut sock = BufReader::new(sock);
+ loop {
+ let packet = Packet::deserialize(&mut sock)?;
+ debug!("<- {packet:?}");
+ tx.send(packet)?;
+ }
+}
+fn handle_conn_write(sock: TcpStream, rx: Receiver<Packet>) -> Result<()> {
+ let mut sock = BufWriter::new(sock);
+ for packet in rx {
+ debug!("-> {packet:?}");
+ packet.serialize(&mut sock)?;
+ }
+ Ok(())
+}