es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo transmitir un vector de bytes a BufWriter?

Estoy tratando de transmitir bytes a un servidor tcp utilizando io::copy(&mut reader, &mut writer), pero me da este error: la asociación "std::io::Read" no está implementada para "Vec<{integer}>". Aquí tengo un vector de bytes que sería lo mismo que abrir un archivo y convertirlo en bytes. Quiero escribir los bytes en el BufWriter. ¿Qué estoy haciendo mal?

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

pub fn connect() {
    if let Ok(stream) = TcpStream::connect("localhost:8080") {
        println!("¡Conexión establecida!");
        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("Error al escribir en el flujo");
    } else {
        println!("No se pudo conectar al servidor");
    }
}
none
error[E0277]: la asociación `Vec<{integer}>: std::io::Read` no está satisfecha
  --> src/lib.rs:12:31
   |
12 |         io::copy(&amp;mut reader, &amp;mut writer).expect(&quot;Error al escribir en el flujo&quot;);
   |         --------              ^^^^^^^^^^^ la asociación `std::io::Read` no está implementada para `Vec<{integer}>`
   |         |
   |         requerido por un límite introducido por esta llamada
   |
nota: requerido por un límite en `std::io::copy`
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que el tipo Vec<integer> no implementa el rasgo std::io::Read, que es requerido para la función io::copy.

    Para solucionar esto, necesitas envolver el vector en un objeto Cursor para crear un búfer legible. Aquí tienes una versión actualizada del código:

    use std::io::{self, Cursor};
    use std::net::TcpStream;
    use std::io::BufWriter;
    
    pub fn connect() {
        if let Ok(stream) = TcpStream::connect("localhost:8080") {
            println!("¡Conexión establecida!");
            let data = 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,
            ];
    
            // Crea un cursor a partir del vector de datos para habilitar la lectura
            let mut reader = Cursor::new(data);
    
            // Crea un buffer de escritura a partir de TcpStream
            let mut writer = BufWriter::new(&stream);
    
            io::copy(&mut reader, &mut writer).expect("Error al escribir en el flujo");
        } else {
            println!("No se pudo conectar al servidor");
        }
    }
    

    Aquí, usamos el objeto Cursor para envolver el vector data, lo que nos permite leerlo como si fuera un archivo. Este objeto cursor se pasa a la función io::copy como el lector.

    Con este cambio, ahora deberías poder transmitir bytes al servidor TCP.

Comments are closed.