我正在Rust中使用unix数据报套接字创建简单的客户端-服务器通信。我正在从客户端接收到长度为字节的消息,但无法转换回我从客户端发送的原始字符串。我试过了https://doc.rust-lang.org/std/str/fn.from_utf8.html和from_utf8_lossy,但没有成功。这是代码。
如何在服务器上获取原始字符串?
服务器端:
use std::os::unix::net::UnixDatagram;
use std::path::Path;
fn unlink_socket (path: impl AsRef<Path>) {
let path = path.as_ref();
if Path::new(path).exists() {
let result = std::fs::remove_file(path);
match result {
Err(e) => {
println!("Couldn't remove the file: {:?}", e);
},
_ => {}
}
}
}
pub fn tcp_datagram_server() {
pub static FILE_PATH: &'static str = "/tmp/datagram.sock";
let mut buf = vec![0; 1024];
unlink_socket(FILE_PATH);
let socket = match UnixDatagram::bind(FILE_PATH) {
Ok(socket) => socket,
Err(e) => {
println!("Couldn't bind: {:?}", e);
return;
}
};
println!("Waiting for client to connect...");
loop {
let received_bytes = socket.recv(buf.as_mut_slice()).expect("recv function failed");
println!("Received {:?}", received_bytes);
}
}
fn main() {
tcp_datagram_server();
}
客户端:
use std::sync::mpsc;
use std::os::unix::net::UnixDatagram;
use std::path::Path;
use std::io::prelude::*;
pub fn tcp_datagram_client() {
pub static FILE_PATH: &'static str = "/tmp/datagram.sock";
let socket = UnixDatagram::unbound().unwrap();
match socket.connect(FILE_PATH) {
Ok(socket) => socket,
Err(e) => {
println!("Couldn't connect: {:?}", e);
return;
}
};
println!("TCP client Connected to TCP Server {:?}", socket);
loop {
socket.send(b"Hello from client to server").expect("recv function failed");
}
}
fn main() {
tcp_datagram_client();
}
我在服务器端得到的结果:
Waiting for client to connect...
Received 27
Received 27
Received 27
Received 27
Received 27
Received 27
Received 27
std::str::from_utf8(buf.as_slice()).unwrap()
应该给您一个&数据的str,如果需要,可以将其转换为字符串:
socket.recv(buf.as_mut_slice()).expect("recv function failed");
let message = std::str::from_utf8(buf.as_slice()).expect("utf-8 convert failed");
第一行将数据读取到buf
中,第二行将buf
中的数据转换为str.