以下是Rust在Linux中进行网络编程的指南,涵盖基础协议和异步编程:
服务器端
使用std::net::TcpListener监听端口,通过incoming()处理客户端连接,示例代码:
use std::io::{Read, Write};
use std::net::{TcpListener, TcpStream};
fn handle_client(mut stream: TcpStream) {
let mut buffer = [0; 1024];
match stream.read(&mut buffer) {
Ok(size) => {
if size == 0 { return; } // 客户端断开
stream.write_all(&buffer[..size]).unwrap(); // 回显数据
}
Err(e) => eprintln!("读取错误: {}", e),
}
}
fn main() -> std::io::Result<()> {
let listener = TcpListener::bind("127.0.0.1:7878")?;
for stream in listener.incoming() {
match stream {
Ok(stream) => handle_client(stream),
Err(e) => eprintln!("连接错误: {}", e),
}
}
Ok(())
}
客户端
使用TcpStream连接服务器并发送数据:
use std::io::Write;
use std::net::TcpStream;
fn main() -> std::io::Result<()> {
let mut stream = TcpStream::connect("127.0.0.1:7878")?;
stream.write_all(b"Hello, server!")?;
Ok(())
}
服务器端
通过UdpSocket接收数据报并回显:
use std::net::UdpSocket;
fn main() -> std::io::Result<()> {
let socket = UdpSocket::bind("127.0.0.1:8080")?;
let mut buffer = [0; 1024];
loop {
let (size, src) = socket.recv_from(&mut buffer)?;
socket.send_to(&buffer[..size], &src)?;
}
}
客户端
发送数据报到服务器:
use std::net::UdpSocket;
fn main() -> std::io::Result<()> {
let socket = UdpSocket::bind("0.0.0.0:0")?;
socket.send_to(b"Hello, UDP!", "127.0.0.1:8080")?;
Ok(())
}
使用tokio库实现异步I/O,支持高并发连接:
use tokio::net::{TcpListener, TcpStream};
use tokio::io::{AsyncReadExt, AsyncWriteExt};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let listener = TcpListener::bind("127.0.0.1:7878").await?;
loop {
let (mut socket, _) = listener.accept().await?;
tokio::spawn(async move {
let mut buffer = [0; 1024];
match socket.read(&mut buffer).await {
Ok(size) => {
if size == 0 { return; }
socket.write_all(&buffer[..size]).await.unwrap();
}
Err(e) => eprintln!("异步读取错误: {}", e),
}
});
}
}
结合tokio::net::UdpSocket实现非阻塞通信(需配置mio事件循环)。
hyper库快速构建HTTP服务器,支持异步请求处理。mio库提供对epoll/kqueue的封装,适合需要精细控制事件的场景。aya框架实现内核级网络数据处理,适用于高性能过滤或监控。Result类型,避免忽略错误导致程序崩溃。