锈-tokio流中的缓冲区是否可以使用&[u8]以外的其他方式?

时间:2019-05-16 02:16:58

标签: asynchronous rust rust-tokio

我正在尝试制作一个回显服务器,该服务器在回复时将大写的字符串大写,以tokio作为练习。我用数组作为缓冲区很烦人,因为如果字符串溢出缓冲区怎么办?

我想知道是否有更好的方法而不使用数组,理想情况下只使用 String 或向量而无需创建缓冲区数组。

我尝试了read_from_string(),但没有异步并最终阻塞了套接字。

extern crate tokio;
use tokio::net::TcpListener;
use tokio::prelude::*;

fn main() {
    let addr = "127.0.0.1:6142".parse().unwrap();
    let listener = TcpListener::bind(&addr).unwrap();

    let server = listener
        .incoming()
        .for_each(|socket| {

            let (mut reader, mut writer) = socket.split();
            let mut buffer = [0; 16];
            reader.poll_read(&mut buffer)?;

            let s = std::str::from_utf8(&buffer).unwrap();
            s.to_uppercase();
            writer.poll_write(&mut s.as_bytes())?;

            Ok(())
        })
        .map_err(|e| {
            eprintln!("something went wrong {}", e);
        });

    tokio::run(server);
}

结果: “ 012345678901234567890”变为->“ 0123456789012345”

我当然可以增加缓冲,但这只会使罐子踢下去。

1 个答案:

答案 0 :(得分:1)

我相信tokio_codec是执行此类任务的正确工具。 Tokio文档:https://tokio.rs/docs/going-deeper/frames/

它使用Bytes / BytesMut作为缓冲区-非常强大的结构,可让您根据需要处理数据并避免不必要的复制