Rust 网络编程:TCP 与 UDP 协议实现
·
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 | 实时游戏、流媒体 |
最佳实践建议
-
错误处理
使用?操作符传播错误,或配合match处理网络异常:match stream.read(&mut buffer) { Ok(n) => println!("Read {} bytes", n), Err(e) => eprintln!("Read error: {}", e), } -
性能优化
- TCP:使用
BufReader/BufWriter减少系统调用 - UDP:批量发送数据报减少开销
- TCP:使用
-
异步支持
使用tokio或async-std库实现异步非阻塞:// tokio 异步 TCP 示例 use tokio::net::TcpListener; async fn run_server() { let listener = TcpListener::bind("127.0.0.1:7878").await.unwrap(); // ...异步处理连接 }
提示:实际开发中推荐使用高层库如
serde(序列化)和tokio(异步运行时)构建健壮应用。
更多推荐
所有评论(0)