Asynchronous 如何在Tokio未来链的多个分支中使用TCP流?

Asynchronous 如何在Tokio未来链的多个分支中使用TCP流?,asynchronous,tcp,rust,future,rust-tokio,Asynchronous,Tcp,Rust,Future,Rust Tokio,我有一个生锈的东京TCP服务器。每个客户都由Tokio future链处理,如下所示: let stream = <TcpStream from elsewhere>; let task = database_connection .and_then(connection| { tokio::io::write_all(stream, SomeSuccessData); }).map_err(|error| {

我有一个生锈的东京TCP服务器。每个客户都由Tokio future链处理,如下所示:

let stream = <TcpStream from elsewhere>;

let task = database_connection
        .and_then(connection| {
            tokio::io::write_all(stream, SomeSuccessData);
        }).map_err(|error| {
            tokio::io::write_all(stream, SomeErrorData(error));
        });

...

tokio::spawn(task);
let stream=;
让任务=数据库连接
.和|然后(连接|{
tokio::io::write_all(流,SomeSuccessData);
}).map|u err(| error |{
tokio::io::write_all(流,SomeErrorData(错误));
});
...
东京:产卵(任务);
问题是我不能在链的多个分支中使用相同的
TcpStream
,因为
tokio::io::write_all
消耗流,即使它应该以顺序方式使用。根据是否存在(例如)数据库错误,发送不同的数据至关重要

我怎样才能克服这个问题?可能有不同的API?

各州的文档:

写入过程中发生的任何错误都将导致流和缓冲区被破坏

由于您的代码似乎试图发送一条网络消息,以表明前一条网络消息失败(这似乎……可疑),因此在您尝试发送第二条消息时,
TcpStream
已经消失

因此,最简单的解决方案是克隆流:

let stream2 = stream.try_clone().expect("Couldn't clone");

let task = database_connection
    .and_then(|_| io::write_all(stream, b"success"))
    .map_err(|_| io::write_all(stream2, b"error"));
如果您只想尝试报告数据库连接失败,则更容易:使用而不是
和\u-then

let task = database_connection.then(|connection| match connection {
    Ok(_) => io::write_all(stream, &b"success"[..]),
    Err(_) => io::write_all(stream2, &b"error"[..]),
});

请检查如何创建一个,然后检查您的问题以将其包括在内。我们无法说出代码中存在哪些板条箱、类型、特征、字段等。试着制造一些能再现你在网络上的错误的东西,或者你可以在一个全新的货运项目中再现它。也有,谢谢。我已经找到了
then
combinator,它非常适合我!