Advertisement
Guest User

actix tcp server

a guest
Aug 20th, 2019
609
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 2.55 KB | None | 0 0
  1. use bytes::BytesMut;
  2. use futures::Stream;
  3. use std::str::FromStr;
  4. use actix::prelude::*;
  5. use actix::io::{FramedWrite, WriteHandler};
  6. use tokio_codec::FramedRead;
  7. use tokio_tcp::{TcpListener, TcpStream};
  8. use tokio_io::{AsyncRead, codec::{Decoder, Encoder}, io::WriteHalf};
  9.  
  10. struct Server;
  11. struct Client(FramedWrite<WriteHalf<TcpStream>, HttpCodec>);
  12.  
  13. #[derive(Message)]
  14. struct Incoming(pub TcpStream);
  15.  
  16. impl Actor for Server {
  17.     type Context = Context<Self>;
  18. }
  19.  
  20. impl Handler<Incoming> for Server {
  21.     type Result = ();
  22.  
  23.     fn handle(&mut self, msg: Incoming, _: &mut Context<Self>) {
  24.         Client::create(move |ctx| {
  25.             let (r, w) = msg.0.split();
  26.             Client::add_stream(FramedRead::new(r, HttpCodec), ctx);
  27.             Client(FramedWrite::new(w, HttpCodec, ctx))
  28.         });
  29.     }
  30. }
  31.  
  32. impl Actor for Client {
  33.     type Context = Context<Self>;
  34. }
  35.  
  36. impl WriteHandler<std::io::Error> for Client {}
  37. impl StreamHandler<HttpPacket, std::io::Error> for Client {
  38.     fn handle(&mut self, _: HttpPacket, _: &mut Self::Context) {
  39.         self.0.write(HttpResponse);
  40.     }
  41. }
  42.  
  43. #[derive(Message)]
  44. struct HttpPacket;
  45. #[derive(Message)]
  46. struct HttpResponse;
  47. struct HttpCodec;
  48.  
  49. impl Decoder for HttpCodec {
  50.     type Item = HttpPacket;
  51.     type Error = std::io::Error;
  52.     fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
  53.         Ok(twoway::find_bytes(src, b"\r\n\r\n").map(|offset| {
  54.             src.advance(offset + b"\r\n\r\n".len());
  55.             HttpPacket
  56.         }))
  57.     }
  58. }
  59.  
  60. impl Encoder for HttpCodec {
  61.     type Item = HttpResponse;
  62.     type Error = std::io::Error;
  63.     fn encode(&mut self, _: Self::Item, dst: &mut BytesMut) -> Result<(), Self::Error> {
  64.         dst.extend_from_slice(b"HTTP/1.1 200 Ok\r\nContent-Length: 11\r\n\r\nHello World");
  65.         Ok(())
  66.     }
  67. }
  68.  
  69. fn main() -> std::io::Result<()> {
  70.     actix::System::run(|| {
  71.         let addr = std::net::SocketAddr::from_str("0.0.0.0:12345").unwrap();
  72.         let listener = TcpListener::bind(&addr).unwrap();
  73.         Server::create(|ctx| {
  74.             ctx.add_message_stream(listener
  75.                 .incoming()
  76.                 .map_err(|_| ())
  77.                 .map(|stream| Incoming(stream))
  78.             );
  79.             Server
  80.         });
  81.         actix::spawn(tokio_signal::ctrl_c()
  82.             .flatten_stream()
  83.             .for_each(|_| {
  84.                 System::current().stop();
  85.                 Ok(())
  86.             })
  87.             .map_err(|_| ())
  88.         );
  89.         println!("Listening on :12345");
  90.     })
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement