以下是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
類型,避免忽略錯誤導致程序崩潰。