Rust如何实现Socket通信

最近在学习Rust的网络编程,想实现一个简单的Socket通信程序。请问在Rust中如何创建TCP Socket并进行基本的读写操作?具体需要用到哪些标准库模块?能否提供一个简单的客户端和服务端通信的代码示例?另外,在Rust中处理Socket时有哪些需要注意的常见错误和性能优化点?

2 回复

Rust使用std::net模块实现Socket通信。创建TCP服务端:

use std::net::TcpListener;
let listener = TcpListener::bind("127.0.0.1:8080")?;

客户端连接:

use std::net::TcpStream;
let stream = TcpStream::connect("127.0.0.1:8080")?;

使用read/write方法收发数据。也可用tokio实现异步通信。


Rust 中实现 Socket 通信主要使用标准库的 std::net 模块。以下是 TCP 和 UDP 的基本实现方法:

TCP 通信示例

服务端代码:

use std::net::{TcpListener, TcpStream};
use std::io::{Read, Write};

fn handle_client(mut stream: TcpStream) {
    let mut buffer = [0; 512];
    stream.read(&mut buffer).unwrap();
    println!("收到消息: {}", String::from_utf8_lossy(&buffer[..]));
    
    let response = b"Hello from server!";
    stream.write(response).unwrap();
    stream.flush().unwrap();
}

fn main() -> std::io::Result<()> {
    let listener = TcpListener::bind("127.0.0.1:8080")?;
    println!("服务器监听在 127.0.0.1:8080");
    
    for stream in listener.incoming() {
        match stream {
            Ok(stream) => {
                std::thread::spawn(|| handle_client(stream));
            }
            Err(e) => {
                eprintln!("连接失败: {}", e);
            }
        }
    }
    Ok(())
}

客户端代码:

use std::net::TcpStream;
use std::io::{Write, Read};

fn main() -> std::io::Result<()> {
    let mut stream = TcpStream::connect("127.0.0.1:8080")?;
    
    let message = b"Hello from client!";
    stream.write(message)?;
    
    let mut buffer = [0; 512];
    stream.read(&mut buffer)?;
    println!("服务器回复: {}", String::from_utf8_lossy(&buffer[..]));
    
    Ok(())
}

UDP 通信示例

服务端代码:

use std::net::UdpSocket;

fn main() -> std::io::Result<()> {
    let socket = UdpSocket::bind("127.0.0.1:8080")?;
    println!("UDP 服务器监听在 127.0.0.1:8080");
    
    let mut buf = [0; 512];
    loop {
        let (amt, src) = socket.recv_from(&mut buf)?;
        let received = String::from_utf8_lossy(&buf[..amt]);
        println!("收到来自 {} 的消息: {}", src, received);
        
        socket.send_to(b"Hello from UDP server!", src)?;
    }
}

客户端代码:

use std::net::UdpSocket;

fn main() -> std::io::Result<()> {
    let socket = UdpSocket::bind("127.0.0.1:0")?; // 0 表示随机端口
    socket.connect("127.0.0.1:8080")?;
    
    socket.send(b"Hello from UDP client!")?;
    
    let mut buf = [0; 512];
    let amt = socket.recv(&mut buf)?;
    println!("服务器回复: {}", String::from_utf8_lossy(&buf[..amt]));
    
    Ok(())
}

关键点说明:

  1. TCP 是面向连接的可靠传输,需要建立连接后通信
  2. UDP 是无连接的,直接发送数据报
  3. 使用 ? 操作符简化错误处理
  4. TCP 服务端使用多线程处理并发连接
  5. 实际项目中建议使用 async/awaittokio 库实现高性能异步通信

对于生产环境,推荐使用 tokio 异步运行时来处理高并发场景。

回到顶部