如何在 Rust 中按顺序从客户端向 tcp 服务器发送多个字节数组?

How can I send multiple arrays of bytes from client to tcp server sequentially in rust?

我想通过 TCP 协议将 2 个转换为字节的字符串按顺序发送到服务器,如下所示:

客户:

let mut stream = TcpStream::connect("127.0.0.1:8080")?;

socket.write("Name".as_bytes())?;
socket.write("Password".as_bytes())?;

let mut buffer = [0; 8];
let len = stream.read(&mut buffer)?;

let buf = &mut buffer[..len];

服务器:

let listener = TcpListener::bind("127.0.0.1:8080")?;
for stream in listener.incoming() {
    thread::spawn(move || -> std::io::Result<()> {
        let mut name = [0; 256]; // 256 Byte Buffer for name
        stream.read(&mut name)?;

        let mut password = [0; 256]; // 256 Byte Buffer for password
        stream.read(&mut password)?;

        stream.write(&[2; 8])?;

        Ok(())
    });
}

但是如果我这样做,服务器将只收到名称,而不会收到密码。

当我让线程在发送名称和密码之间休眠 1 毫秒时,它会工作,但这似乎是一个糟糕的解决方案,我不确定当服务器不 运行 作为本地主机时它是否工作。

我也不喜欢将“名称”和“密码”组合成一个字节数组来一次发送,因为我已经考虑过服务器应该如何工作并且它完全基于这样的想法,即客户端发送多个小包,这些包将按顺序处理。

这甚至可能吗?或者这通常是与 TCP 相关的非常愚蠢的事情吗?

我找到了解决方案!

而不是在服务器端使用 stream.read() 我不得不使用 stream.read_exact().

然后它将读取直到从客户端发送了 256 个字节(字节数 = 缓冲区长度)

这样它不能 return 收到缓冲区的长度,但我通过将长度写入缓冲区的第一个字节来绕过这个问题(只有 256 字节的大缓冲区是可能的,不过)