在 Rust 中进行网络编程,主要可以利用标准库中的 `std::net` 模块,以及社区提供的异步运行时库如 Tokio 和 Async-std。以下是一个简单的 TCP 服务器和客户端的示例,以及一个 UDP 服务的示例。
TCP 服务器和客户端示例
TCP 服务器
```rust
use std::net::{TcpListener, TcpStream};
use std::io::{Read, Write};
fn main() -> std::io::Result<()> {
// 监听本地的 7878 端口
let listener = TcpListener::bind("127.0.0.1:7878")?;
println!("服务端正在等待连接...");
for stream in listener.incoming() {
let mut stream = stream?;
println!("新客户端连接: {}", stream.peer_addr()?);
// 读取客户端发来的数据
let mut buffer = [0; 512];
stream.read(&mut buffer)?;
println!("收到数据: {}", String::from_utf8_lossy(&buffer));
// 向客户端发送响应
stream.write(b"HTTP/1.1 200 OK\r\n\r\nHello, world!")?;
}
Ok(())
}
```
TCP 客户端
```rust
use std::net::TcpStream;
use std::io::{Read, Write};
fn main() -> std::io::Result<()> {
// 连接到服务器的 7878 端口
let mut stream = TcpStream::connect("127.0.0.1:7878")?;
// 向服务器发送数据
stream.write(b"Hello, server!")?;
// 读取服务器的响应
let mut buffer = [0; 512];
stream.read(&mut buffer)?;
println!("收到服务器的响应: {}", String::from_utf8_lossy(&buffer));
Ok(())
}
```
UDP 服务示例
```rust
use std::net::{UdpSocket, SocketAddr};
fn main() -> std::io::Result<()> {
// 创建一个 UDP 套接字
let socket = UdpSocket::bind("127.0.0.1:7878")?;
println!("服务端正在等待 UDP 数据包...");
let mut buffer = [0; 512];
// 接收来自客户端的数据包
let (len, addr) = socket.recv_from(&mut buffer)?;
println!("收到来自 {} 的数据: {}", addr, String::from_utf8_lossy(&buffer[..len]));
// 向客户端发送响应
socket.send_to(b"Hello, client!", &addr)?;
Ok(())
}
```
使用异步运行时
如果你希望使用异步运行时来处理大量并发连接,可以使用 Tokio 或 Async-std。以下是使用 Tokio 的示例:
TCP 服务器(异步)
```rust
use tokio::net::{TcpListener, TcpStream};
use tokio::io::{Read, Write};
[tokio::main]
async fn main() -> std::io::Result<()> {
// 监听本地的 7878 端口
let listener = TcpListener::bind("127.0.0.1:7878").await?;
println!("服务端正在等待连接...");
loop {
// 接受客户端连接
let (mut stream, addr) = listener.accept().await?;
println!("新客户端连接: {}", addr);
// 处理客户端连接的异步任务
tokio::spawn(async move {
let mut buffer = [0; 512];
// 读取客户端发来的数据
stream.read(&mut buffer).await.unwrap();
println!("收到数据: {}", String::from_utf8_lossy(&buffer));
// 向客户端发送响应
stream.write(b"HTTP/1.1 200 OK\r\n\r\nHello, world!").await.unwrap();
});
}
}
```
UDP 服务(异步)