我正在尝试为具有自己的简单 TCP 协议的程序构建一个简单的客户端包。
大多数通信通过发送命令并立即读取单行响应来进行。有些命令需要读取多个响应。我一直在BufReader::read_line()
阅读单行,但是当它读取太多时,这似乎会下降,第二个read_line()
可能会丢失行的开头。
我的假设是我打算保持BufReader
周围,以便它保持其内部状态。
我通过将引用传递给 the 来做到这一点TcpStream
,BufReader
但BufWriter
我得到“借来的价值不会活得足够长”。我的问题是;我在哪里“存储”TcpStream
它以使其寿命足够长?
我尝试了不同的迭代尝试将其存储stream
在Connection
结构上,但我似乎无法让它工作。
这是代码的精简版本:
use std::io::{self, BufReader, BufWriter};
use std::net::TcpStream;
#[derive(Debug)]
pub struct Connection<'a> {
reader: BufReader<&'a TcpStream>,
writer: BufWriter<&'a TcpStream>,
}
impl<'a> Connection<'a> {
pub fn new(stream: TcpStream) -> io::Result<Self> {
let connection = Self {
reader: BufReader::new(&stream),
writer: BufWriter::new(&stream),
};
Ok(connection)
}
}
pub struct Search<'a> {
connection: Connection<'a>,
}
impl<'a> Search<'a> {
// fn new(stream: &'a TcpStream) -> Self {
fn new() -> Self {
let stream = TcpStream::connect("127.0.0.1:100").unwrap();
let connection = Connection::new(stream).unwrap();
Self { connection }
}
}
fn main() {
// let stream = TcpStream::connect("127.0.0.1:100").unwrap();
// Search::new(&stream);
Search::new();
}
如果我取消注释注释掉的行,它就可以工作。