extern crate ws;
use std::thread;
use std::thread::sleep;
use std::time::Duration;
use ws::{connect, listen, CloseCode, Sender, Handler, Message, Result, Error, Handshake};
use tokio::io::{self, AsyncReadExt};
use tokio::time::delay_for;
use tokio::task;
#[tokio::main]
async fn main () {
struct Server {
out: Sender,
}
impl Handler for Server {
fn on_message(&mut self, msg: Message) -> Result<()> {
println!("Server got message '{}'. ", msg);
self.out.send(msg)
}
fn on_close(&mut self, code: CloseCode, reason: &str) {
println!("WebSocket closing for ({:?}) {}", code, reason);
}
}
struct Client {
out: Sender,
}
impl Handler for Client {
fn on_open(&mut self, _: Handshake) -> Result<()> {
println!("on_open connect to ws://127.0.0.1:8080");
Ok(())
}
fn on_message(&mut self, msg: Message) -> Result<()> {
println!("Got message: {}", msg);
Ok(())
}
fn on_close(&mut self, code: CloseCode, reason: &str) {
println!("on_close code = {:?}, reason = {}", code, reason);
}
fn on_error(&mut self, err: Error) {
println!("on_error err = {}", err);
}
}
let server = task::spawn(async move {
listen("127.0.0.1:3012", |out| {
Server { out: out }
}).unwrap()
});
sleep(Duration::from_millis(10));
let client = task::spawn(async move {
connect("ws://127.0.0.1:8080", |out| {
Client { out: out }
}).unwrap()
});
server.await;
client.await;
println!("All done.")
}