use futures::{Future, Stream}; use log::*; use tokio::net::TcpListener; use tokio_tungstenite::{accept_async, tungstenite::Error as WsError}; fn main() { env_logger::init(); let mut runtime = tokio::runtime::Builder::new().build().unwrap(); let addr = "127.0.0.1:9002".parse().unwrap(); let socket = TcpListener::bind(&addr).unwrap(); info!("Listening on: {}", addr); let srv = socket .incoming() .map_err(Into::into) .for_each(move |stream| { let peer = stream .peer_addr() .expect("connected streams should have a peer address"); info!("Peer address: {}", peer); accept_async(stream).and_then(move |ws_stream| { info!("New WebSocket connection: {}", peer); let (sink, stream) = ws_stream.split(); let job = stream .filter(|msg| msg.is_text() || msg.is_binary()) .forward(sink) .and_then(|(_stream, _sink)| Ok(())) .map_err(|err| match err { WsError::ConnectionClosed => (), err => info!("WS error: {}", err), }); tokio::spawn(job); Ok(()) }) }); runtime.block_on(srv).unwrap(); }