Linux下Rust网络编程入门指南
一 环境准备与项目初始化
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh,安装完成后按提示将 Rust 加入 PATH。cargo new rust_network_demo && cd rust_network_demo。cargo run 构建并运行;开发阶段可使用 cargo check 快速语法检查。二 阻塞式 TCP 编程 std::net
TcpListener、TcpStream,以及地址类型如 IpAddr / SocketAddr。// 服务器端 src/main.rs
use std::io::{Read, Write};
use std::net::{TcpListener, TcpStream};
fn handle_client(mut stream: TcpStream) {
let mut buf = [0; 1024];
loop {
match stream.read(&mut buf) {
Ok(0) => break, // 对端关闭
Ok(n) => {
if let Err(e) = stream.write_all(&buf[..n]) {
eprintln!("write error: {}", e);
break;
}
}
Err(e) => {
eprintln!("read error: {}", e);
break;
}
}
}
}
fn main() -> std::io::Result<()> {
let listener = TcpListener::bind("127.0.0.1:7878")?;
println!("Server listening on 127.0.0.1:7878");
for stream in listener.incoming() {
match stream {
Ok(stream) => std::thread::spawn(|| handle_client(stream)),
Err(e) => eprintln!("accept error: {}", e),
}
}
Ok(())
}
// 客户端 src/bin/client.rs
use std::io::{Read, 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, Rust TCP\n")?;
let mut buf = [0; 1024];
let n = stream.read(&mut buf)?;
println!("Received: {}", String::from_utf8_lossy(&buf[..n]));
Ok(())
}
cargo run;在终端 B 运行 cargo run --bin client。nc 127.0.0.1 7878 或 telnet 127.0.0.1 7878 进行交互测试。三 异步 TCP 编程 Tokio
[dependencies]
tokio = { version = "1", features = ["full"] }
// src/main.rs
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?;
println!("Async server listening on 127.0.0.1:7878");
loop {
let (mut socket, addr) = listener.accept().await?;
println!("Accepted connection from {:?}", addr);
tokio::spawn(async move {
let mut buf = [0; 1024];
loop {
let n = match socket.read(&mut buf).await {
Ok(0) => return, // 对端关闭
Ok(n) => n,
Err(e) => {
eprintln!("read error: {}", e);
return;
}
};
if let Err(e) = socket.write_all(&buf[..n]).await {
eprintln!("write error: {}", e);
return;
}
}
});
}
}
cargo run;终端 B 使用 nc/telnet 或编写对应的异步客户端进行连接测试。四 关键要点与常见问题
\n)、基于长度前缀(先发送 N 字节长度再发送负载)。五 下一步学习路径与生态