首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在无限循环中异步地重新连接客户端到服务器?

如何在无限循环中异步地重新连接客户端到服务器?
EN

Stack Overflow用户
提问于 2018-04-13 04:56:54
回答 1查看 0关注 0票数 0

我无法创建试图连接到服务器的客户端,并且:

  • 如果服务器关闭,它必须在无限循环中再次尝试
  • 如果服务器启动并且连接成功,则当连接丢失(即服务器断开客户端)时,客户端必须重新启动无限循环才能尝试连接到服务器

以下是连接到服务器的代码; 目前当连接丢失时,程序退出。我不确定实现它的最佳方式是什么; 也许我必须创建一个Future无限循环?

代码语言:javascript
复制
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箱子:

代码语言:javascript
复制
tokio-line = { git = "https://github.com/tokio-rs/tokio-line" }
EN

回答 1

Stack Overflow用户

发布于 2018-04-13 14:37:25

使用 loop_fn

futures箱子里有一个功能,它完全符合你的需求。它被称为loop_fn。可以通过将主要功能更改为以下来使用它:

代码语言:javascript
复制
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(可参见Loopenum 的文档),该循环可以继续或中断。在这种情况下,我们选择永远继续,因此它将无限地保持重新连接。

请注意,get_connection如果出现错误(例如,如果客户端无法连接到服务器),版本将会发生混乱。如果还想在发生错误后重试,则应该将调用移除panic!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100005262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档