1
0
Fork 0
mirror of https://github.com/actix/actix-web.git synced 2024-11-26 03:21:08 +00:00

update websocket example

This commit is contained in:
Nikolay Kim 2017-10-23 18:42:15 -07:00
parent 6d9bd4e04c
commit bea8e4825d

View file

@ -1,3 +1,8 @@
//! Simple echo websocket server.
//! Open `http://localhost:8080/ws/index.html` in browser
//! or [python console client](https://github.com/actix/actix-web/blob/master/examples/websocket-client.py)
//! could be used for testing.
#![allow(unused_variables)] #![allow(unused_variables)]
extern crate actix; extern crate actix;
extern crate actix_web; extern crate actix_web;
@ -13,19 +18,24 @@ impl Actor for MyWebSocket {
type Context = HttpContext<Self>; type Context = HttpContext<Self>;
} }
/// Http route handler
impl Route for MyWebSocket { impl Route for MyWebSocket {
type State = (); type State = ();
fn request(req: &mut HttpRequest, fn request(req: &mut HttpRequest,
payload: Payload, ctx: &mut HttpContext<Self>) -> RouteResult<Self> payload: Payload, ctx: &mut HttpContext<Self>) -> RouteResult<Self>
{ {
// websocket handshake
let resp = ws::handshake(req)?; let resp = ws::handshake(req)?;
// send HttpResponse back to peer
ctx.start(resp); ctx.start(resp);
// convert bytes stream to a stream of `ws::Message` and register it
ctx.add_stream(ws::WsStream::new(payload)); ctx.add_stream(ws::WsStream::new(payload));
Reply::async(MyWebSocket) Reply::async(MyWebSocket)
} }
} }
/// Standard actix's stream handler for a stream of `ws::Message`
impl StreamHandler<ws::Message> for MyWebSocket { impl StreamHandler<ws::Message> for MyWebSocket {
fn started(&mut self, ctx: &mut Self::Context) { fn started(&mut self, ctx: &mut Self::Context) {
println!("WebSocket session openned"); println!("WebSocket session openned");
@ -40,6 +50,7 @@ impl Handler<ws::Message> for MyWebSocket {
fn handle(&mut self, msg: ws::Message, ctx: &mut HttpContext<Self>) fn handle(&mut self, msg: ws::Message, ctx: &mut HttpContext<Self>)
-> Response<Self, ws::Message> -> Response<Self, ws::Message>
{ {
// process websocket messages
println!("WS: {:?}", msg); println!("WS: {:?}", msg);
match msg { match msg {
ws::Message::Ping(msg) => ws::WsWriter::pong(ctx, msg), ws::Message::Ping(msg) => ws::WsWriter::pong(ctx, msg),
@ -66,6 +77,7 @@ fn main() {
// websocket route // websocket route
.resource("/ws/", |r| r.get::<MyWebSocket>()) .resource("/ws/", |r| r.get::<MyWebSocket>())
.route_handler("/", StaticFiles::new("examples/static/", true))) .route_handler("/", StaticFiles::new("examples/static/", true)))
// start http server on 127.0.0.1:8080
.serve::<_, ()>("127.0.0.1:8080").unwrap(); .serve::<_, ()>("127.0.0.1:8080").unwrap();
println!("Started http server: 127.0.0.1:8080"); println!("Started http server: 127.0.0.1:8080");