Io 使用Read::Read_to_字符串从TCP流中读取将挂起,直到远程端关闭连接

Io 使用Read::Read_to_字符串从TCP流中读取将挂起,直到远程端关闭连接,io,rust,network-programming,Io,Rust,Network Programming,我正在尝试实现in-Rust,在连接后读取服务器发送给我的内容时遇到一些困难。似乎发生的是,我连接,从服务器读取~5 KB,然后大约240秒后,所有内容都立即转储,而不是逐行读取。连接被ping超时关闭,这最终应该会发生,因为我还没有一个ping-pong函数来回复 以下是我目前掌握的情况: use std::io::{Read, Write}; use std::net::TcpStream; fn main() { let mut stream = TcpStream::conne

我正在尝试实现in-Rust,在连接后读取服务器发送给我的内容时遇到一些困难。似乎发生的是,我连接,从服务器读取~5 KB,然后大约240秒后,所有内容都立即转储,而不是逐行读取。连接被ping超时关闭,这最终应该会发生,因为我还没有一个ping-pong函数来回复

以下是我目前掌握的情况:

use std::io::{Read, Write};
use std::net::TcpStream;

fn main() {
    let mut stream = TcpStream::connect("irc.freenode.org:6667").unwrap();

    let _ = stream.write(b"NICK G-SERUFU\r\n");
    let _ = stream.write(b"USER G-SERUFU 0 * :brobot\r\n");
    let _ = stream.write(b"JOIN #tutbot-testing\r\n");

    let mut line = String::with_capacity(512);
    loop {
        let result = stream.read_to_string(&mut line);
        match result {
            Ok(n) => println!("Received {} bytes", n),
            _ => {}
        }
        line.clear();
    }
}
当我修改循环a以使用数组而不是字符串时,我会立即得到预期的输出:

let mut line;
loop {
    line = [0; 512];
    let result = stream.read(&mut line);
    match result {
        Ok(n) => println!("Received {} bytes",n),
        _ => {},
    }
}
我的结论是
stream.read\u to\u string(&mut line)
不知何故是罪魁祸首。为什么会这样?有什么明显的东西我忽略了吗

更具体地说,在第一种情况下,输出在ping超时后出现,在ping超时后打印以下内容:

//在将任何内容打印到控制台之前大约需要4分钟
接收到5323字节
接收到0字节
接收到0字节
接收到0字节
//继续打印“已接收0字节”,因为连接已关闭,但我尚未脱离无限循环
在使用阵列的第二种情况下,我几乎立即收到正确的输出:

接收到64个字节
接收到51字节
接收512字节
接收512字节
接收到350字节
接收512字节
接收512字节
...
查看重点,我的:

读取此源中的所有字节直到EOF,将它们放入
buf

同样适用于:

读取此源中的所有字节直到EOF,将它们放入
buf

值得注意的是,在第一个示例中,您没有读取512字节,而是预先分配512字节的空间,然后读取每个字节,直到套接字关闭—4分钟后

听起来您想使用:

读取所有字节,直到到达换行字节(0xA字节),并将它们附加到提供的缓冲区

此函数将继续从基础流读取(和缓冲)字节,直到找到换行符(0xA字节)或EOF。找到分隔符(如果找到)之前的所有字节(包括该分隔符)都将附加到buf


您还可以使用任何其他技术,在返回之前读取固定数量的数据。一个这样的例子是,它将限制您一次可以读取的总字节数。

请准确描述这两种情况下发生的情况。问题可能与
流有关。对于字符串和数组,读取
重载是如何不同的,例如,对于字符串,它可以等待收到512字节后再返回,而对于数组,它会立即返回,即使收到的字节数较少。很可能这不是真的(逻辑上很奇怪),但你得到了这个想法。这个问题是关于
TCPStream
,据我所知,在这个问题上,人们无法应用
BufRead::read_line
,不是吗?@pantelissopasaki很抱歉我迟到了,但不,你可以应用它。BufReader可以缓冲任何实现读取的类型,而TcpStream也不例外。