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(())
}
关键点说明:
- TCP 是面向连接的可靠传输,需要建立连接后通信
- UDP 是无连接的,直接发送数据报
- 使用
?操作符简化错误处理 - TCP 服务端使用多线程处理并发连接
- 实际项目中建议使用
async/await和tokio库实现高性能异步通信
对于生产环境,推荐使用 tokio 异步运行时来处理高并发场景。

