internal_server/
internal_server.rs

1use log::*;
2use simple_websocket::handshake::perform_handshake;
3use std::net::SocketAddr;
4use tokio::net::{TcpListener, TcpStream};
5use tokio::select;
6
7async fn handle_connection(_: SocketAddr, stream: TcpStream) {
8    match perform_handshake(stream).await {
9        Ok(mut ws_connection) => loop {
10            select! {
11                Some(result) = ws_connection.read.recv() => {
12                    match result {
13                        Ok(message) => {
14                            if ws_connection.send_data(message).await.is_err() {
15                                eprintln!("Failed to send message");
16                                break;
17                            }
18                        }
19                        Err(err) => {
20                            eprintln!("Received error from the stream: {}", err);
21                            break;
22                        }
23                    }
24                }
25                else => break
26            }
27        },
28        Err(err) => eprintln!("Error when performing handshake: {}", err),
29    }
30}
31
32#[tokio::main]
33async fn main() {
34    env_logger::init();
35
36    let addr = "127.0.0.1:9002";
37    let listener = TcpListener::bind(&addr).await.expect("Can't listen");
38    info!("Listening on: {}", addr);
39
40    while let Ok((stream, _)) = listener.accept().await {
41        let peer = stream
42            .peer_addr()
43            .expect("connected streams should have a peer address");
44        info!("Peer address: {}", peer);
45
46        tokio::spawn(handle_connection(peer, stream));
47    }
48}