1
0
mirror of https://github.com/actix/actix-website synced 2024-11-27 18:12:57 +01:00

Websockets chapter done-ish.

This commit is contained in:
Cameron Dershem 2019-06-26 12:55:12 -04:00
parent 4436eff7de
commit 387807ee6e
3 changed files with 47 additions and 31 deletions

View File

@ -4,10 +4,10 @@ menu: docs_proto
weight: 240 weight: 240
--- ---
Actix supports WebSockets out-of-the-box. It is possible to convert a request's `Payload` Actix-web supports WebSockets with the `actix-web-actors` crate. It is possible to convert a
to a stream of [*ws::Message*][message] with a [*ws::WsStream*][wsstream] and then use stream request's `Payload` to a stream of [*ws::Message*][message] with a [*web::Payload*][payload]
combinators to handle actual messages, but it is simpler to handle websocket communications and then use stream combinators to handle actual messages, but it is simpler to handle
with an http actor. websocket communications with an http actor.
The following is an example of a simple websocket echo server: The following is an example of a simple websocket echo server:
@ -18,7 +18,7 @@ The following is an example of a simple websocket echo server:
> An example chat server with the ability to chat over a websocket or tcp connection > An example chat server with the ability to chat over a websocket or tcp connection
> is available in [websocket-chat directory][chat] > is available in [websocket-chat directory][chat]
[message]: ../../actix-web/actix_web/ws/enum.Message.html [message]: https://docs.rs/actix-web-actors/1.0.0/actix_web_actors/ws/enum.Message.html
[wsstream]: ../../actix-web/actix_web/ws/struct.WsStream.html [payload]: https://docs.rs/actix-web/1.0.2/actix_web/web/struct.Payload.html
[examples]: https://github.com/actix/examples/tree/master/websocket/ [examples]: https://github.com/actix/examples/tree/master/websocket/
[chat]: https://github.com/actix/examples/tree/master/websocket-chat/ [chat]: https://github.com/actix/examples/tree/master/websocket-chat/

View File

@ -1,8 +1,9 @@
[package] [package]
name = "websockets" name = "websockets"
version = "0.7.0" version = "1.0.0"
edition = "2018" edition = "2018"
[dependencies] [dependencies]
actix = "0.7" actix = "0.8"
actix-web = "1.0" actix-web = "1.0"
actix-web-actors = "1.0"

View File

@ -1,29 +1,44 @@
// <websockets> // <websockets>
// use actix::*; use actix::{Actor, StreamHandler};
// use actix_web::*; use actix_web::{web, App, Error, HttpRequest, HttpResponse, HttpServer};
use actix_web_actors::ws;
// /// Define http actor /// Define http actor
// struct Ws; struct MyWs;
// impl Actor for Ws { impl Actor for MyWs {
// type Context = ws::WebsocketContext<Self>; type Context = ws::WebsocketContext<Self>;
// } }
// /// Handler for ws::Message message /// Handler for ws::Message message
// impl StreamHandler<ws::Message, ws::ProtocolError> for Ws { impl StreamHandler<ws::Message, ws::ProtocolError> for MyWs {
// fn handle(&mut self, msg: ws::Message, ctx: &mut Self::Context) { fn handle(&mut self, msg: ws::Message, ctx: &mut Self::Context) {
// match msg { match msg {
// ws::Message::Ping(msg) => ctx.pong(&msg), ws::Message::Ping(msg) => ctx.pong(&msg),
// ws::Message::Text(text) => ctx.text(text), ws::Message::Text(text) => ctx.text(text),
// ws::Message::Binary(bin) => ctx.binary(bin), ws::Message::Binary(bin) => ctx.binary(bin),
// _ => (), _ => (),
// } }
// } }
// } }
// fn main() { fn index(req: HttpRequest, stream: web::Payload) -> Result<HttpResponse, Error> {
// App::new() let resp = ws::start(MyWs {}, &req, stream);
// .resource("/ws/", |r| r.f(|req| ws::start(req, Ws))) println!("{:?}", resp);
// .finish(); resp
// } }
fn main() {
HttpServer::new(|| App::new().route("/ws/", web::get().to(index)))
.bind("127.0.0.1:8088")
.unwrap()
.run()
.unwrap();
}
// </websockets> // </websockets>
// testing requires specific headers:
// Upgrade: websocket
// Connection: Upgrade
// Sec-WebSocket-Key: SOME_KEY
// Sec-WebSocket-Version: 13