网络编程 TCP/UDP
学习目标
- 掌握 TCP 服务端/客户端
- 掌握 UDP 通信
- 理解非阻塞 IO
核心概念
TCP 服务端
use std::net::{TcpListener, TcpStream};
use std::io::{Read, Write};
fn handle_client(mut stream: TcpStream) {
let mut buf = [0; 1024];
let n = stream.read(&mut buf).unwrap();
let request = String::from_utf8_lossy(&buf[..n]);
println!("收到: {}", request);
let response = "HTTP/1.1 200 OK\r\n\r\nHello!";
stream.write_all(response.as_bytes()).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() {
let stream = stream?;
std::thread::spawn(move || handle_client(stream));
}
Ok(())
}
TCP 客户端
use std::net::TcpStream;
use std::io::{Read, Write};
fn main() -> std::io::Result<()> {
let mut stream = TcpStream::connect("127.0.0.1:8080")?;
stream.write_all(b"Hello, server!")?;
let mut buf = [0; 1024];
let n = stream.read(&mut buf)?;
println!("收到: {}", String::from_utf8_lossy(&buf[..n]));
Ok(())
}
UDP
use std::net::UdpSocket;
fn main() -> std::io::Result<()> {
let socket = UdpSocket::bind("127.0.0.1:8080")?;
let mut buf = [0; 1024];
let (n, src) = socket.recv_from(&mut buf)?;
println!("从 {} 收到: {}", src, String::from_utf8_lossy(&buf[..n]));
socket.send_to(b"pong", src)?;
let socket = UdpSocket::bind("127.0.0.1:0")?;
socket.send_to(b"ping", "127.0.0.1:8080")?;
let mut buf = [0; 1024];
let n = socket.recv(&mut buf)?;
println!("收到: {}", String::from_utf8_lossy(&buf[..n]));
Ok(())
}
小结
| 操作 | API |
|---|
| TCP 监听 | TcpListener::bind |
| TCP 连接 | TcpStream::connect |
| UDP 绑定 | UdpSocket::bind |
| 发送 | send_to, write_all |
| 接收 | recv_from, read |