diff --git a/README.md b/README.md index a8e2193fc..1c3173636 100644 --- a/README.md +++ b/README.md @@ -42,32 +42,74 @@ actix-web = "0.1" ```rust extern crate actix; extern crate actix_web; -extern crate futures; +extern crate env_logger; use actix::*; use actix_web::*; -fn main() { - let system = System::new("test"); - // start http server +struct MyWebSocket; + +impl Actor for MyWebSocket { + type Context = HttpContext; +} + +impl Route for MyWebSocket { + type State = (); + + fn request(req: &mut HttpRequest, + payload: Payload, ctx: &mut HttpContext) -> RouteResult + { + let resp = ws::handshake(req)?; + ctx.start(resp); + ctx.add_stream(ws::WsStream::new(payload)); + Reply::async(MyWebSocket) + } +} + +impl StreamHandler for MyWebSocket { + fn started(&mut self, ctx: &mut Self::Context) { + println!("WebSocket session openned"); + } + + fn finished(&mut self, ctx: &mut Self::Context) { + println!("WebSocket session closed"); + } +} + +impl Handler for MyWebSocket { + fn handle(&mut self, msg: ws::Message, ctx: &mut HttpContext) + -> Response + { + println!("WS: {:?}", msg); + match msg { + ws::Message::Ping(msg) => ws::WsWriter::pong(ctx, msg), + ws::Message::Text(text) => ws::WsWriter::text(ctx, &text), + ws::Message::Binary(bin) => ws::WsWriter::binary(ctx, bin), + ws::Message::Closed | ws::Message::Error => { + ctx.stop(); + } + _ => (), + } + Self::empty() + } +} + +fn main() { + ::std::env::set_var("RUST_LOG", "actix_web=info"); + let _ = env_logger::init(); + let sys = actix::System::new("ws-example"); + HttpServer::new( - // create application Application::default("/") - .resource("/", |r| - r.handler(Method::GET, |req, payload, state| { - httpcodes::HTTPOk - }) - ) - .finish()) + // enable logger + .middleware(Logger::new(None)) + // websocket route + .resource("/ws/", |r| r.get::()) + .route_handler("/", StaticFiles::new("examples/static/", true))) .serve::<_, ()>("127.0.0.1:8080").unwrap(); - // stop system - Arbiter::handle().spawn_fn(|| { - Arbiter::system().send(msgs::SystemExit(0)); - futures::future::ok(()) - }); - - system.run(); + println!("Started http server: 127.0.0.1:8080"); + let _ = sys.run(); } ```