如何在期货链中使用Result类型中包含的套接字?

dergroncki

我有以下Tokio文档中的以下工作代码,我对其做了一些修改:

// Task
let connection = io::read_exact(socket, buf_read)
    .and_then(|(socket, buf_read)| {
        println!("Do something with the received data...");
        for b in &buf_read {
            println!("{}", b);
        }

        // Write to the socket
        let buf_write = vec![19; 30];
        io::write_all(socket, buf_write)
    })
    .then(|res| {
        println!("{:?}", res); // Just for testing
        //Output: Ok((TcpStream, [19, 19, 19, ...]

        println!("Send data...");
        let buf_write = vec![18; 10]; // Fill the buffer with some data
        //
        //How to use the socket contained in res to write the data to the socket
        //    
        Ok(())
    });

文档中提到

请注意,它resResult包含原始套接字的。这使我们可以对同一套接字上的其他读取或写入进行排序。

如何使用中包含的套接字Result将数据写入套接字?

Shepmaster

请首先重新阅读Rust编程语言,特别是有关带有Result的可恢复错误的章节然后重新阅读您正在使用的库的文档

Future::then,重点:

fn then<F, B>(self, f: F) -> Then<Self, B, F>
where
    F: FnOnce(Result<Self::Item, Self::Error>) -> B,
    B: IntoFuture,
    Self: Sized,

链结计算将来何时完成,将未来的结果传递给提供的闭包f

无论将来如何得出结论此功能都可用于确保计算运行提供的关闭将被产生了Result,一旦未来完成。

将此与您正在使用其他功能进行对比Future::and_then,重点是:

fn and_then<F, B>(self, f: F) -> AndThen<Self, B, F>
where
    F: FnOnce(Self::Item) -> B,
    B: IntoFuture<Error = Self::Error>,
    Self: Sized, 

成功解决后,再执行另一个将来

此功能可用于将两个期货链接在一起,并确保直到两个期货都完成才解决最终的期货。提供的闭包产生了该未来的成功结果,并返回了另一个可以转换为未来的值。


一种解决方案是仅通过and_then以下方式成功处理它

extern crate tokio; // 0.1.7

use tokio::{io, net::TcpStream, prelude::*};

fn example(socket: TcpStream, buf_read: Vec<u8>) {
    io::read_exact(socket, buf_read)
        .and_then(|(socket, buf_read)| {
            let buf_write = vec![19; 30];
            io::write_all(socket, buf_write)
        }).and_then(|(socket, data)| {
            let buf_write = vec![18; 10];
            io::write_all(socket, buf_write)
        });
    // TODO: use future somehow 
}

如果您想了解该故障,则可以继续使用,then但必须以某种方式处理该错误:

fn example(socket: TcpStream, buf_read: Vec<u8>) {
    io::read_exact(socket, buf_read)
        .and_then(|(socket, buf_read)| {
            let buf_write = vec![19; 30];
            io::write_all(socket, buf_write)
        }).then(|res| match res {
            Ok((socket, data)) => {
                let buf_write = vec![18; 10];
                io::write_all(socket, buf_write)
            }
            Err(e) => {
                // Do something with the error and return another
                // future that's type-compatible
                unimplemented!()
            },
        });
    // TODO: use future somehow
}

也可以看看:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Flutter的期货中使用期货?

如何在JavaScript \ HTML中使用套接字?

如何在Python中使用原始套接字?

如何在Android中使用UDP套接字?

如何在Python和子进程中使用套接字?

Swift如何在iOS中使用UDP套接字?

如何在Python中使用套接字响应SSDP搜索?

如何在c中使用套接字发送文件

如何在组件中使用动态套接字URL?

我如何在 Flutter web 中使用套接字

如何在 python 的套接字中使用线程?

如何在Python中使用套接字创建通道

Socket.IO-如何在socket.io 1.3.6中使用socketID关闭套接字?

如何在Ubuntu Server 18.04中使用系统启动来运行网络套接字?

如何在 WINDOWS 中使用 C/C++ 在 UDP 套接字中设置超时?

是否可以在套接字中使用代理链

如何从包含期货的结果中创建期货?

如何在Java中的WebClient中使用Vertx路由器中的期货

如何在K8s ReadinessProbe和LivenessProbe中的套接字文件中使用gevent检查uwsgi

如何在C中模拟套接字

如何在JVM中实现套接字?

如何在套接字上使用 setTimeout?

从使用期货的套接字列表中选择

GTIN如何在区块链中使用?

如何在Python中使用套接字作为上下文管理器?

如何在Python中使用套接字作为上下文管理器?

如何在没有套接字的Android中使用TCP客户端?

如何在Java中使用相同的套接字连接执行多个HTTP请求?

如何在docker中使用unix套接字将nginx连接到php-fpm