MST
星途 面试题库

面试题:Rust Socket编程中的多线程并发处理

使用Rust的Socket实现一个支持多客户端连接的服务器。每个客户端连接由一个独立线程处理,服务器需要能够接收客户端发送的消息,并且将接收到的消息广播给所有已连接的客户端。请考虑如何管理线程安全以及处理可能出现的资源竞争问题。
28.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::net::{TcpListener, TcpStream};
use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let listener = TcpListener::bind("127.0.0.1:8080").expect("Failed to bind");
    let clients = Arc::new(Mutex::new(Vec::new()));

    for stream in listener.incoming() {
        let stream = stream.expect("Failed to accept");
        let clients_clone = clients.clone();
        thread::spawn(move || {
            handle_client(stream, clients_clone);
        });
    }
}

fn handle_client(mut stream: TcpStream, clients: Arc<Mutex<Vec<TcpStream>>>) {
    let mut buffer = [0; 1024];
    let read_result = stream.read(&mut buffer);
    let read_bytes = match read_result {
        Ok(n) => n,
        Err(e) => {
            println!("Failed to read from client: {}", e);
            return;
        }
    };
    let message = String::from_utf8_lossy(&buffer[..read_bytes]);

    let mut clients_guard = clients.lock().expect("Failed to lock clients");
    for client in clients_guard.iter_mut() {
        if let Err(e) = client.write_all(message.as_bytes()) {
            println!("Failed to write to client: {}", e);
        }
    }
    clients_guard.push(stream);
}
  1. 创建监听套接字:使用TcpListener::bind绑定到指定地址和端口。
  2. 管理客户端连接
    • 使用Arc<Mutex<Vec<TcpStream>>>来管理所有已连接的客户端。Arc用于在多个线程间共享数据,Mutex用于确保线程安全的访问。
  3. 处理每个客户端连接
    • listener.incoming()的循环中,为每个新连接的客户端创建一个新线程。
    • handle_client函数负责从客户端读取数据,并将数据广播给所有已连接的客户端。
    • 在读取和广播数据时,使用Mutex来保护对clients向量的访问,避免资源竞争。