如何在 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 字节的大缓冲区是可能的,不过)
我想通过 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 字节的大缓冲区是可能的,不过)