我的目标是从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读取每个消息的消息,知道每个消息可以具有不同的未知大小?
[尽管在特定情况下它们都相互作用,但与Vec
相比,std::io::Read
的潜在技术性让您更加着迷。
Read
状态的定义和文档:
如果此方法的返回值为Ok(n),则必须保证0 <= n <= buf.len()。 n值非零表示缓冲区buf已被来自该源的n个字节的数据填充。如果n为0,则可以指示以下两种情况之一:
重要部分以粗体显示。
按照您的方式定义新的Vec
时,其容量为zero。这意味着基础切片(将用作缓冲区)的长度为零。结果,由于必须确保0 <= n <= buf.len()
并且buf.len()
为零,因此read()
调用将立即返回读取的0字节。]
要“修复”此问题,您可以为Vec
(Vec::new().resize(1024, 0)
)分配一组默认元素,也可以只使用一开始就使用的数组(let mut buffer:[u8; 1024] = [0; 1024]
)