【问题标题】:the trait bound `tokio::net::tcp::stream::TcpStream: tokio_io::async_read::AsyncRead` is not satisfied特征绑定`tokio::net::tcp::stream::TcpStream: tokio_io::async_read::AsyncRead`不满足
【发布时间】:2019-12-30 14:44:58
【问题描述】:

我无法编译一个简单的应用程序来测试 tokio-codec。 tokio::net::tcp::stream::TcpStream 实现 AsyncRead 和 -Write。 但是当我尝试编译下面的代码时,我得到了下面的错误。 我还是 Rust 和 Tokio 的新手,所以毫无疑问我错过了一些明显的东西(我希望)......

main.rs:

use tokio::net::TcpListener;
use tokio::prelude::*;
use tokio_codec::{ Framed, LinesCodec };


#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
  let mut listener = TcpListener::bind("127.0.0.1:12321").await?;

  loop {
    let (socket, _addr) = listener.accept().await?;

    tokio::spawn(async move {
      let (_sink, mut stream) = Framed::new(socket, LinesCodec::new()).split();

      while let Some(Ok(line)) = stream.next().await {
        println!("{:?}", line);
      }
    });
  }
}

Cargo.toml:

[dependencies]
tokio = { version = "0.2.6", features = ["full"] }
tokio-codec = "0.1.1"

输出:

error[E0277]: the trait bound `tokio::net::tcp::stream::TcpStream: tokio_io::async_read::AsyncRead` is not satisfied
  --> src\main.rs:14:36
   |
14 |       let (mut sink, mut stream) = Framed::new(socket, LinesCodec::new()).split();
   |                                    ^^^^^^^^^^^ the trait `tokio_io::async_read::AsyncRead` is not implemented for `tokio::net::tcp::stream::TcpStream`
   |
   = note: required by `tokio_io::_tokio_codec::framed::Framed::<T, U>::new`

error[E0277]: the trait bound `tokio::net::tcp::stream::TcpStream: tokio_io::async_write::AsyncWrite` is not satisfied
  --> src\main.rs:14:36
   |
14 |       let (mut sink, mut stream) = Framed::new(socket, LinesCodec::new()).split();
   |                                    ^^^^^^^^^^^ the trait `tokio_io::async_write::AsyncWrite` is not implemented for `tokio::net::tcp::stream::TcpStream`
   |
   = note: required by `tokio_io::_tokio_codec::framed::Framed::<T, U>::new`

error[E0599]: no method named `split` found for type `tokio_io::_tokio_codec::framed::Framed<tokio::net::tcp::stream::TcpStream, tokio_codec::lines_codec::LinesCodec>` in the current scope
  --> src\main.rs:14:75
   |
14 |       let (mut sink, mut stream) = Framed::new(socket, LinesCodec::new()).split();
   |                                                                           ^^^^^ method not found in `tokio_io::_tokio_codec::framed::Framed<tokio::net::tcp::stream::TcpStream, tokio_codec::lines_codec::LinesCodec>`
   |
   = note: the method `split` exists but the following trait bounds were not satisfied:
           `&mut tokio_io::_tokio_codec::framed::Framed<tokio::net::tcp::stream::TcpStream, tokio_codec::lines_codec::LinesCodec> : tokio::io::util::async_buf_read_ext::AsyncBufReadExt`
           `&tokio_io::_tokio_codec::framed::Framed<tokio::net::tcp::stream::TcpStream, tokio_codec::lines_codec::LinesCodec> : tokio::io::util::async_buf_read_ext::AsyncBufReadExt`
           `tokio_io::_tokio_codec::framed::Framed<tokio::net::tcp::stream::TcpStream, tokio_codec::lines_codec::LinesCodec> : tokio::io::util::async_buf_read_ext::AsyncBufReadExt`

我该如何解决这个问题?

【问题讨论】:

    标签: asynchronous compiler-errors rust traits rust-tokio


    【解决方案1】:

    tokio-codec 是一个过时的 crate,它依赖于 Tokio (0.1.7) 的 pre-async/await 版本

    编解码器 seem to have been movedtokio-util 取决于 Tokio 0.2,所以你应该有更多的运气。

    一般来说,当编译器告诉你一个类型没有实现一个 trait,但在文档中你看到它实现了,这意味着你有两个不同版本的 crate 来定义你的项目中的 trait(Tokio 0.1 和 0.2 in本例)。

    【讨论】:

    • 我已经被困在这个问题上很长时间了。读完这篇文章后,我刚刚做了cargo update,它又开始工作了。谢谢
    • 对我来说,我必须手动固定我的包版本,而不是使用通配符,才能让它工作。
    猜你喜欢
    • 2020-02-18
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2022-11-30
    • 2021-03-28
    • 2021-08-04
    • 2019-12-29
    • 2021-06-23
    相关资源
    最近更新 更多