Cliente

En un loop manda mensaje y espera respuesta.

Protocolo simple texto + \n

No está bien hacer esto de mandar mensaje y bloquearse hasta esperar respuesta.

use std::io::{BufRead, BufReader, stdin, Write};
use std::net::TcpStream;
use std::thread::sleep;
use std::time::{Duration, SystemTime};
use std::{env, io};

fn main() -> io::Result<()> {

    let mut name = env::args().skip(1).next().expect("Falta parametro del nombre");

    let mut stream = TcpStream::connect("127.0.0.1:12345")?;
    println!("Conectado");

    let mut reader = BufReader::new(stream.try_clone()?);

    loop {
        println!("Enviando");
        stream.write_all(name.as_bytes())?;
        stream.write_all(b"\\n")?;
        let mut line:String = String::new();
        reader.read_line(&mut line)?;
        println!("Recibo: {}", line);
        sleep(Duration::from_secs(1))
    }

}

Servidor

Hace el bind y por cada conexión entrante levanta un hilo.

Lee el socket y por cada mensaje imprime hello + mensaje.

use std::io::{BufRead, BufReader, Read, Write};
use std::net::{SocketAddr, TcpListener, TcpStream};
use std::thread;

fn main() {
    let listener = TcpListener::bind("127.0.0.1:12345").unwrap();

    println!("Esperando conexiones!");

    for opt_stream in listener.incoming() {
        if let Ok(mut stream) = opt_stream {
            let addr = stream.peer_addr().unwrap();
            println!("[{:?}] Cliente conectado", addr);
            thread::spawn(move || receiver(stream, addr));
        } else {
            println!("Error al conectar")
        }

    }
}

fn receiver(mut stream: TcpStream, addr: SocketAddr) {
    let mut reader = BufReader::new(stream.try_clone().expect(""));
    loop {
        let mut buffer = String::new();
        if let Ok(read) = reader.read_line(&mut buffer) {
            if read > 0 {
                // Aca proceso el mensaje
                println!("[{:?}] Hello {}", addr, buffer);
                stream.write_all(format!("Hello {}", buffer).as_bytes())
                    .expect("");
            } else {
                println!("[{:?}] Goodbye!", addr);
                break;
            }
        } else {
            println!("[{:?}] Error leyendo socket!", addr);
            break;
        }
    }
}