【问题标题】:How to stream a vector of bytes to BufWriter?如何将字节向量流式传输到 BufWriter?
【发布时间】:2022-01-20 17:34:38
【问题描述】:

我正在尝试使用 io::copy(&mut reader, &mut writer) 将字节流式传输到 tcp 服务器,但它给了我这个错误:the trait "std::io::Read" is not implemented for "Vec<{integer}>"。在这里,我有一个字节向量,这与我打开文件并将其转换为字节相同。我想将字节写入BufWriter。我做错了什么?

use std::io;
use std::net::TcpStream;
use std::io::BufWriter;

pub fn connect() {
    if let Ok(stream) = TcpStream::connect("localhost:8080") {
        println!("Connection established!");
        let mut reader = vec![
            137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 70, 0, 0, 0, 70,
        ];
        let mut writer = BufWriter::new(&stream);
        io::copy(&mut reader, &mut writer).expect("Failed to write to stream");
    } else {
        println!("Couldn't connect to the server")
    }
}
error[E0277]: the trait bound `Vec<{integer}>: std::io::Read` is not satisfied
  --> src/lib.rs:12:31
   |
12 |         io::copy(&mut reader, &mut writer).expect("Failed to write to stream");
   |         --------              ^^^^^^^^^^^ the trait `std::io::Read` is not implemented for `Vec<{integer}>`
   |         |
   |         required by a bound introduced by this call
   |
note: required by a bound in `std::io::copy`

【问题讨论】:

    标签: rust tcp stream byte buffer


    【解决方案1】:

    像这样使用.as_slice() 对我有用:

    pub fn connect() {
        if let Ok(stream) = TcpStream::connect("localhost:8080") {
            println!("Connection established!");
            let reader = vec![
                137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 70, 0, 0, 0, 70,
            ];
            let mut writer = BufWriter::new(&stream);
            io::copy(&mut reader.as_slice(), &mut writer).expect("Failed to write to stream");
        } else {
            println!("Couldn't connect to the server")
        }
    }
    

    那是因为std::io::Read 支持切片。

    【讨论】:

      【解决方案2】:

      这里编译器有点麻烦,Vec 没有实现 Read&amp;[u8] 实现了,在创建可变引用之前,您只需从 vec 获取一个 slice

      copy(&mut reader.as_slice(), &mut writer).expect("Failed to write to stream");
      

      另见:

      【讨论】:

      • 好的,切片是什么?
      • 现在服务器出现紧急情况:thread "main" panicked at "called "Result::unwrap()" on an "Err" value: Error { kind: InvalidData, message: "stream did not contain valid UTF-8" }"。是否可以将字节流式传输到 tcp 服务器?
      • @Nicke7117 您发送的另一个问题我无法真正帮助您
      • @Nicke7117 最好将您的服务器恐慌作为一个单独的问题询问。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 2021-08-03
      相关资源
      最近更新 更多