我使用的是 rustls
,并想阅读 TlsStream
到缓冲区,同样,我们读取 TcpStream
. 这是我正在做的。
let acceptor = TlsAcceptor::from(Arc::new(config));
let fut = async {
let mut listener = TcpListener::bind(&addr).await?;
loop {
let (stream, peer_addr) = listener.accept().await?;
let acceptor = acceptor.clone();
let fut = async move {
let mut stream = acceptor.accept(stream).await?;
//// CURRENTLY THIS .read() is throwing error in compiler
println!("Stream: {:?}", stream.read(&mut [0; 1024]));
Ok(()) as io::Result<()>
};
handle.spawn(fut.unwrap_or_else(|err| eprintln!("{:?}", err)));
}
};
它抛出错误
'error[E0599]: no method named `read` found for struct `tokio_rustls::server::TlsStream<tokio::net::tcp::stream::TcpStream>` in the current scope'
我希望从 TlsStream
产生的 tokio-rustls
到缓冲区。
解决方案:
正如你的错误信息所描述的那样,有一个特性 AsyncReadExt
但没有导入到 scope 中。为了能够使用 read
方法,你需要导入该特质;对于这个特质,通常是通过导入该特质的 东京序曲:
use tokio::prelude::*;
// or you can explicitly import just AsyncReadExt, but I'd recommend the above
use tokio::io::AsyncReadExt;
此外,你还需要特别 await
所得 read()
,因为它返回的是一个未来。你还需要在一个单独的变量中使用缓冲区,因为那是存储读取数据的地方。
let mut buffer = [0; 1024];
let byte_count = stream.read(&mut buffer).await;
// ^^^^^^
println!("Stream: {:?}", &buffer[0..byte_count]);
本文来自投稿,不代表运维实战侠立场,如若转载,请注明出处:https://www.shizhanxia.com/844.html