我无法创建试图连接到服务器的客户端,并且:
以下是连接到服务器的代码; 目前当连接丢失时,程序退出。我不确定实现它的最佳方式是什么; 也许我必须创建一个Future
无限循环?
extern crate tokio_line;
use tokio_line::LineCodec;
fn get_connection(handle: &Handle) -> Box<Future<Item = (), Error = io::Error>> {
let remote_addr = "127.0.0.1:9876".parse().unwrap();
let tcp = TcpStream::connect(&remote_addr, handle);
let client = tcp.and_then(|stream| {
let (sink, from_server) = stream.framed(LineCodec).split();
let reader = from_server.for_each(|message| {
println!("{}", message);
Ok(())
});
reader.map(|_| {
println!("CLIENT DISCONNECTED");
()
}).map_err(|err| err)
});
let client = client.map_err(|_| { panic!()});
Box::new(client)
}
fn main() {
let mut core = Core::new().unwrap();
let handle = core.handle();
let client = get_connection(&handle);
let client = client.and_then(|c| {
println!("Try to reconnect");
get_connection(&handle);
Ok(())
});
core.run(client).unwrap();
}
添加tokio-line箱子:
tokio-line = { git = "https://github.com/tokio-rs/tokio-line" }
发布于 2018-04-13 14:37:25
使用 loop_fn
futures
箱子里有一个功能,它完全符合你的需求。它被称为loop_fn
。可以通过将主要功能更改为以下来使用它:
fn main() {
let mut core = Core::new().unwrap();
let handle = core.handle();
let client = future::loop_fn((), |_| {
// Run the get_connection function and loop again regardless of its result
get_connection(&handle).map(|_| -> Loop<(), ()> {
Loop::Continue(())
})
});
core.run(client).unwrap();
}
该函数类似于for循环,根据结果get_connection
(可参见Loop
enum 的文档),该循环可以继续或中断。在这种情况下,我们选择永远继续,因此它将无限地保持重新连接。
请注意,get_connection
如果出现错误(例如,如果客户端无法连接到服务器),版本将会发生混乱。如果还想在发生错误后重试,则应该将调用移除panic!
https://stackoverflow.com/questions/-100005262
复制相似问题