首页 > 解决方案 > 对 TcpStreams 的 Read trait 如何工作的误解

问题描述

我的目标是从 TcpStream 中读取一些字节,以便解析每条消息中的数据并从中构建一个结构。

loop {
    let mut buf: Vec<u8> = Vec::new();
    let len = stream.read(&mut buf)?;
    if 0 == len {
        //Disconnected
    }
    println!("read() -> {}", len);
}

就像在 Python 中一样,我认为它stream.read()会阻塞,直到它收到一些数据。所以我设置了一个服务器,它为每个传入连接调用你在上面看到的循环。然后我尝试使用 netcat 连接到服务器;netcat 成功连接到服务器并阻塞在 上stream.read(),这是我想要的;但是一旦我发送一些数据,就会read()返回0. 我也尝试过做类似的事情,stream.read_to_end()但它似乎只在连接关闭时才返回。

我如何从 TcpStream 中读取每条消息的消息,知道每条消息可以有不同的未知大小?

标签: tcprust

解决方案


尽管在这种特殊情况下它们都相互影响,但潜在的技术性Vec超过了 by ,您会被您的裤子所吸引。std::io::Read

状态的定义和文档Read

如果此方法的返回值为 Ok(n),则必须保证 0 <= n <= buf.len()。非零 n 值表示缓冲区 buf 已被来自此源的 n 字节数据填充。如果 n 为 0,则它可以指示以下两种情况之一:

重要部分加粗。

当您以您Vec的方式定义一个新的时,它的容量从零开始。这意味着底层切片(您将用作缓冲区)的长度为零。结果,由于必须保证0 <= n <= buf.len()and sincebuf.len()为零,因此您的read()调用会立即返回并读取 0 个字节。

要“修复”这个问题,您可以为Vec( ) 分配一组默认元素,或者只使用 get-go ( )Vec::new().resize(1024, 0)中的数组let mut buffer:[u8; 1024] = [0; 1024]


推荐阅读