我正在尝试为具有自己的简单TCP协议的程序构建一个简单的客户端程序包。
大多数通信是通过发送命令并立即读取单个线路响应来进行的。一些命令需要读取多个响应。我一直在使用BufReader::read_line()
来读取单行,但是当它读得太多时,它似乎会下降,第二个read_line()
可能会丢失该行的开头。
我的假设是,我打算将BufReader
保留在其内部,以保持其内部状态。
我这样做是通过将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();
}
如果我取消注释掉注释行,它将起作用。