//! A simple echo server. //! //! You can test this out by running: //! //! cargo run --example server 127.0.0.1:12345 //! //! And then in another window run: //! //! cargo run --example client ws://127.0.0.1:12345/ use std::{env, io::Error}; use async_std::net::{TcpListener, TcpStream, ToSocketAddrs}; use async_std::task; use futures::StreamExt; use log::info; async fn run() -> Result<(), Error> { let _ = env_logger::try_init(); let addr = env::args().nth(1).unwrap_or("127.0.0.1:8080".to_string()); let addr = addr .to_socket_addrs() .await .expect("Not a valid address") .next() .expect("Not a socket address"); // Create the event loop and TCP listener we'll accept connections on. let try_socket = TcpListener::bind(&addr).await; let listener = try_socket.expect("Failed to bind"); info!("Listening on: {}", addr); while let Ok((stream, _)) = listener.accept().await { task::spawn(accept_connection(stream)); } Ok(()) } async fn accept_connection(stream: TcpStream) { let addr = stream .peer_addr() .expect("connected streams should have a peer address"); info!("Peer address: {}", addr); let ws_stream = async_tungstenite::accept_async(stream) .await .expect("Error during the websocket handshake occurred"); info!("New WebSocket connection: {}", addr); let (write, read) = ws_stream.split(); read.forward(write) .await .expect("Failed to forward message") } fn main() -> Result<(), Error> { task::block_on(run()) }