tcp - 对 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 中读取每条消息的消息,知道每条消息可以有不同的未知大小?
解决方案
尽管在这种特殊情况下它们都相互影响,但潜在的技术性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]
推荐阅读
- bing-maps - Bing Maps V8 SDK - 获取绘制的形状
- html - CSS技巧:将属性值放入另一个css标签
- php - Laravel 中表之间的雄辩关系
- html - 文本正在调整 flexbox 子项的大小而不是换行(使用 flex-grow)
- ruby - Sassc-2.0.0 需要 ruby 版本 >= 2.3.3,与当前版本 ruby 2.3.0p0 不兼容
- javascript - 如果我有三个相同的值,则在不知道值的情况下签入数组
- r - 如何修复计算集群上 R 中的合并错误(fix.by(by.y, y) 中的错误:'by' 必须指定唯一有效的列)
- c# - 如何给多个按钮一个类似的代码?
- hyperledger-fabric - 服务器管理员可以访问存储在 SideDB 中的私有数据吗?
- vue.js - 不小心点击浏览器的后退按钮时如何删除vue-snotify通知