1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
#[allow(unused_imports)] use bytes::{Buf, BytesMut}; #[allow(unused_imports)] use tokio::io::{AsyncReadExt, AsyncWriteExt, BufWriter}; use tokio::net::TcpStream; /// Send and receive `Frame` values from a remote peer. /// /// When implementing networking protocols, a message on that protocol is /// often composed of several smaller messages known as frames. The purpose of /// `Connection` is to read and write frames on the underlying `WsStream`. /// /// To read frames, the `Connection` uses an internal buffer, which is filled /// up until there are enough bytes to create a full frame. Once this happens, /// the `Connection` creates the frame and returns it to the caller. /// /// When sending frames, the frame is first encoded into the write buffer. /// The contents of the write buffer are then written to the socket. #[derive(Debug)] pub struct Connection { // The `WsStream`. It is decorated with a `BufWriter`, which provides write // level buffering. The `BufWriter` implementation provided by Tokio is // sufficient for our needs. stream: BufWriter<TcpStream>, /// The buffer for reading frames. Unfortunately, Tokio's `BufReader` // currently requires you to empty its buffer before you can ask it to // retrieve more data from the underlying stream, so we have to manually // implement buffering. This should be fixed in Tokio v0.3. buffer: BytesMut, } impl Connection { /// Create a new `Connection`, backed by `socket`. Read and write buffers /// are initialized. pub fn new(socket: TcpStream) -> Connection { Connection { stream: BufWriter::new(socket), // Default to a 4KB read buffer. For the use case check ws req. // this is not so fine. However, real applications will want to tune this // value to their specific use case. There is a high likelihood that // a larger read buffer will work better. buffer: BytesMut::with_capacity(4 * 1024), } } }