Rust 网络编程:TCP 与 UDP 协议实现

在 Rust 中实现网络通信主要依赖 std::net 模块,下面分别介绍 TCP 和 UDP 的实现方法。所有代码示例均遵循 Rust 的安全性和所有权原则。


TCP 协议实现

TCP 是面向连接的可靠传输协议,通过三次握手建立连接,适合需要数据完整性的场景。

TCP 服务器示例

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

fn handle_client(mut stream: TcpStream) {
    let mut buffer = [0; 512];
    stream.read(&mut buffer).unwrap();
    println!("Received: {}", String::from_utf8_lossy(&buffer[..]));
    stream.write(b"ACK").unwrap();
}

fn main() -> std::io::Result<()> {
    let listener = TcpListener::bind("127.0.0.1:7878")?;
    for stream in listener.incoming() {
        match stream {
            Ok(stream) => {
                thread::spawn(|| handle_client(stream));
            }
            Err(e) => eprintln!("Connection failed: {}", e),
        }
    }
    Ok(())
}

TCP 客户端示例

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

fn main() -> std::io::Result<()> {
    let mut stream = TcpStream::connect("127.0.0.1:7878")?;
    stream.write_all(b"Hello TCP")?;
    let mut buffer = [0; 512];
    stream.read(&mut buffer)?;
    println!("Server response: {}", String::from_utf8_lossy(&buffer));
    Ok(())
}

关键点

  • 使用 TcpListener 绑定端口监听连接
  • TcpStream 处理读写操作
  • 多线程处理并发连接
  • 数据通过字节流传输

UDP 协议实现

UDP 是无连接的轻量级协议,适合低延迟场景(如音视频流),但不保证数据可靠性。

UDP 服务器示例

use std::net::UdpSocket;

fn main() -> std::io::Result<()> {
    let socket = UdpSocket::bind("127.0.0.1:7878")?;
    let mut buffer = [0; 512];
    
    loop {
        let (bytes, src) = socket.recv_from(&mut buffer)?;
        println!("Received: {}", String::from_utf8_lossy(&buffer[..bytes]));
        socket.send_to(b"ACK", src)?;
    }
}

UDP 客户端示例

use std::net::UdpSocket;

fn main() -> std::io::Result<()> {
    let socket = UdpSocket::bind("0.0.0.0:0")?; // 绑定随机端口
    socket.connect("127.0.0.1:7878")?;
    socket.send(b"Hello UDP")?;
    let mut buffer = [0; 512];
    let bytes = socket.recv(&mut buffer)?;
    println!("Server response: {}", String::from_utf8_lossy(&buffer[..bytes]));
    Ok(())
}

关键点

  • 使用 UdpSocket 收发数据报
  • recv_from 获取数据来源地址
  • 无需建立持久连接
  • 单线程可处理多个客户端

协议对比

特性 TCP UDP
连接类型 面向连接 无连接
可靠性 数据完整保证 可能丢包
传输速度 较慢(需握手/确认) 极快
数据边界 字节流(无边界) 数据报(保留边界)
适用场景 文件传输、HTTP 实时游戏、流媒体

最佳实践建议

  1. 错误处理
    使用 ? 操作符传播错误,或配合 match 处理网络异常:

    match stream.read(&mut buffer) {
        Ok(n) => println!("Read {} bytes", n),
        Err(e) => eprintln!("Read error: {}", e),
    }
    

  2. 性能优化

    • TCP:使用 BufReader/BufWriter 减少系统调用
    • UDP:批量发送数据报减少开销
  3. 异步支持
    使用 tokioasync-std 库实现异步非阻塞:

    // tokio 异步 TCP 示例
    use tokio::net::TcpListener;
    async fn run_server() {
        let listener = TcpListener::bind("127.0.0.1:7878").await.unwrap();
        // ...异步处理连接
    }
    

提示:实际开发中推荐使用高层库如 serde(序列化)和 tokio(异步运行时)构建健壮应用。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐