72·标准库深入进阶

网络编程 TCP/UDP

网络编程 TCP/UDP

学习目标

  1. 掌握 TCP 服务端/客户端
  2. 掌握 UDP 通信
  3. 理解非阻塞 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

练习编辑器

rust
Loading...