привязка признака `tokio :: net :: tcp :: stream :: TcpStream: tokio_io :: async_read :: AsyncRead` не выполняется

Я не могу собрать простое приложение для тестирования токио-кодека. 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`

Как я могу это решить?


person Henk de Marie    schedule 30.12.2019    source источник


Ответы (1)


tokio-codec - это устаревший ящик, который зависит от версии Tokio (0.1.7) до async / await.

Кодеки , похоже, были перемещены в tokio-util, который зависит от Tokio 0.2, так что вам должно повезти с этим больше.

Как правило, когда компилятор сообщает вам, что тип не реализует признак, но в документации вы видите, что он реализует его, это означает, что у вас есть две разные версии ящика, определяющего признак в вашем проекте (в данном случае Tokio 0.1 и 0.2). .

person justinas    schedule 30.12.2019
comment
Я так долго зацикливался на этом. Прочитав это, я просто сделал cargo update, и он снова начал работать. Спасибо - person 너를 속였다; 21.11.2020
comment
Мне приходилось закреплять свои версии пакетов вручную, а не использовать подстановочные знаки, чтобы заставить его работать. - person Bardi Harborow; 10.06.2021