基于Tokio的TCP连接:如何读取字节并转换为字符串
解决Tokio TCP读取字节转字符串打印的问题
你可以通过以下操作将读取到的字节转换为字符串并打印输出:
- 截取有效数据:缓冲区
data是固定1024字节的容器,实际有效数据只有前n个字节,需截取&data[0..n]获取有效字节切片。 - 转换为字符串:根据数据编码情况选择合适的转换方式:
- 若不确定数据是否为合法UTF-8,用
String::from_utf8_lossy,它会把无效UTF-8字符替换为�,无需处理错误。 - 若确定数据是合法UTF-8,可使用
String::from_utf8,但需要处理转换失败的情况。
- 若不确定数据是否为合法UTF-8,用
修改后的完整代码如下:
use tokio::io::Interest; use tokio::net::TcpStream; use std::error::Error; use std::io; #[tokio::main] async fn main() -> Result<(), Box<dyn Error>> { let stream = TcpStream::connect("127.0.0.1:8080").await?; loop { let ready = stream.ready(Interest::READABLE | Interest::WRITABLE).await?; if ready.is_readable() { let mut data = vec![0; 1024]; // Try to read data, this may still fail with `WouldBlock` // if the readiness event is a false positive. match stream.try_read(&mut data) { Ok(n) if n == 0 => { // 读取到0字节表示TCP连接已被对方关闭 println!("Connection closed"); break; } Ok(n) => { println!("read {} bytes", n); // 安全转换为字符串(兼容无效UTF-8) let received_text = String::from_utf8_lossy(&data[0..n]); println!("Received content: {}", received_text); // 若确定数据是合法UTF-8,可使用以下方式(需处理错误) // let received_text = String::from_utf8(data[0..n].to_vec())?; // println!("Received content: {}", received_text); } Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => { continue; } Err(e) => { return Err(e.into()); } } } // 此处可添加可写状态的处理逻辑,比如向服务器发送数据 } Ok(()) }
额外说明:
- 新增了
n == 0的判断逻辑,当读取到0字节时说明TCP连接已被对方关闭,此时退出循环是合理的处理方式。 - 两种字符串转换方式可根据实际业务场景选择,
from_utf8_lossy是通用性更强的方案。
内容的提问来源于stack exchange,提问作者Blankman
相关产品推荐
相关产品推荐

