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

如何在rust中按顺序将多个字节数组从客户端发送到tcp服务器?,rust,tcp,Rust,Tcp,我想通过TCP协议将2个转换为字节的字符串按顺序发送到服务器,如下所示: 客户: let mut stream=TcpStream::connect(“127.0.0.1:8080”)?; socket.write(“Name.as_bytes())?; socket.write(“密码”.as_bytes())?; 让mut buffer=[0;8]; 设len=stream.read(&mut buffer)?; 设buf=&mut缓冲区[…len]; 服务器: let listener

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

客户:

let mut stream=TcpStream::connect(“127.0.0.1:8080”)?;
socket.write(“Name.as_bytes())?;
socket.write(“密码”.as_bytes())?;
让mut buffer=[0;8];
设len=stream.read(&mut buffer)?;
设buf=&mut缓冲区[…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(())
    });
}
let listener=TcpListener::bind(“127.0.0.1:8080”)?;
对于listener.incoming()中的流{
线程::生成(移动| |->标准::io::结果{
让mut name=[0;256];//名称的256字节缓冲区
stream.read(&mut name)?;
让mut password=[0;256];//密码的256字节缓冲区
stream.read(&mut密码)?;
stream.write(&[2;8])?;
好(())
});
}
但是如果我这样做,服务器将只接收名称,而不接收密码

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

我也不喜欢将“Name”和“Password”组合到一个字节数组中一次发送,因为我已经想到了服务器应该如何工作,它完全基于这样一个想法,即客户端发送多个小的包,这些包将按顺序处理

这是可能的,还是说用TCP做起来很愚蠢?

我找到了解决办法

我没有在服务器端使用
stream.read()
,而是使用
stream.read()

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


通过这种方式,它无法返回接收到的缓冲区的长度,但我通过将长度写入缓冲区的第一个字节(tho,只有256字节的大缓冲区)来避免了这个问题。

请注意,使用TCP,单个
写入
可以拆分为多个
读取
,多个
写入
可能对应于单个
读取
。你无法控制它,所以你的协议被设计破坏了。