Я не могу создать клиента, который пытается подключиться к серверу, и:
- Если сервер не работает, он должен повторить попытку в бесконечном цикле
- Если сервер встал и соединение прошло успешно, когда соединение потеряно (например, сервер отключает клиент), клиент должен перезапустить бесконечный цикл, чтобы попытаться подключиться к серверу.
Здесь код для подключения к серверу; в настоящее время, когда соединение потеряно, программа завершает работу. Я не уверен, что лучший способ его реализовать; возможно, мне нужно создать 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" }