You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Tokio的TCP连接:如何读取字节并转换为字符串

解决Tokio TCP读取字节转字符串打印的问题

你可以通过以下操作将读取到的字节转换为字符串并打印输出:

  • 截取有效数据:缓冲区data是固定1024字节的容器,实际有效数据只有前n个字节,需截取&data[0..n]获取有效字节切片。
  • 转换为字符串:根据数据编码情况选择合适的转换方式:
    • 若不确定数据是否为合法UTF-8,用String::from_utf8_lossy,它会把无效UTF-8字符替换为�,无需处理错误。
    • 若确定数据是合法UTF-8,可使用String::from_utf8,但需要处理转换失败的情况。

修改后的完整代码如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 05:40:30