rust-tokio 流中的缓冲区有没有办法使用 &[u8] 以外的东西?
buffer in rust-tokio streams is there a way to use something other then &[u8]?
我正在尝试制作一个在回复时将字符串大写的回显服务器,以练习 tokio 作为练习。我使用数组作为缓冲区,这很烦人,因为如果字符串溢出缓冲区怎么办?
我想知道是否有更好的方法而不使用数组,理想情况下只使用 String 或向量而不需要创建缓冲区数组。
我尝试了 read_from_string() 但不是 async 并最终阻塞了套接字。
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”
我当然可以增加缓冲区,但它只会把罐子踢到路上。
我相信 tokio_codec
是完成此类任务的正确工具。 Tokio 文档:https://tokio.rs/docs/going-deeper/frames/
它使用 Bytes
/ BytesMut
作为缓冲区 - 非常强大的结构,可让您随心所欲地处理数据并避免不必要的复制
我正在尝试制作一个在回复时将字符串大写的回显服务器,以练习 tokio 作为练习。我使用数组作为缓冲区,这很烦人,因为如果字符串溢出缓冲区怎么办?
我想知道是否有更好的方法而不使用数组,理想情况下只使用 String 或向量而不需要创建缓冲区数组。
我尝试了 read_from_string() 但不是 async 并最终阻塞了套接字。
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”
我当然可以增加缓冲区,但它只会把罐子踢到路上。
我相信 tokio_codec
是完成此类任务的正确工具。 Tokio 文档:https://tokio.rs/docs/going-deeper/frames/
它使用 Bytes
/ BytesMut
作为缓冲区 - 非常强大的结构,可让您随心所欲地处理数据并避免不必要的复制