30 Ngày học Rust - Day 25: Xây dựng TCP Web Server Đa Luồng (Phần 1: Lõi Socket)
Day 25: Bắt đầu chuỗi Project cực hạn cuối khóa. Tự tay viết một Web Server từ con số 0 mà không dùng bất kì thư viện web nào. Bài 1: Mở cổng TCP Listener.

Lời Tuyên Ngôn của Tuần Cuối Cùng (Project Khớp Đỉnh)
Kể từ Ngày 25 đến Ngày 30 cuối khoá, chúng ta Sẽ KHÔNG Học Lí Thuyết Rời Rạc nữa. Bạn sẽ gom hết mớ kiến thức chắp nối 24 ngày qua (Struct, Result, Closure, Trait, Multithread Arc) vào chung 1 Cấu trúc: Xây MỘT WEB DEMO SERVER HTTP Bằng CHÍNH TAY MÌNH, Từ Bùn Đất Không Lấy Thư Viện Sẵn Mì Ăn Liền!!
Để chạy Cỗ máy Web Cân Triệu Traffic kia, Gốc Rễ Đáy của Nó là Thao Tác Băm Ống Kênh Lõi IP/TCP Của Main OS Socket. Hôm Nay, Mở Nút Bức Cửa Mạng Đất Cho Trạm Chờ!

1. Mở Khoá Cổng TCP Lắng Nghe Khách (Listener Binding)
Hai Vị Khách Muốn Móc Nối Data Vọc Vào Server Mạng Thì Máy Chủ Phải Có Lỗ Mở Địa Chỉ (Port). Cổng Thông Lệ Lõi Đi Giao Giao Tiếp Khách HTTP Là 80. Lên Test Cục Bộ PC Xài Ngầm Là 7878.
File Gốc src/main.rs:
use std::net::TcpListener;
fn main() {
// 1. Cắm Trạm Quát Ống Nghe Giáp Mép Địa Cầu (Trói Biển LocalHost : Cổng 7878)
// Nếu Đã Có Thằng Tự Build Cổng Khác Áp Chung Port, Result Quả Sẽ Error Crash (unwrap Dập).
let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
// 2. Chăm Mắt Vòng Qua Cổng Chờ Liên Tục
for stream in listener.incoming() {
// Dính Gập 1 Lõi Chắp Stream Cầu Thông Trái Data
let stream = stream.unwrap();
println!("✨ Kết Nối Vỏ Ốp Đã Thông Một Vị Khách!");
}
}Hãy mở 1 Tab Gõ cargo run Ở Giữa Kẻ Console. Xong Mở Chui Tab Browser Máy Bạn, Gõ Vô Trụ Link http://127.0.0.1:7878. Màn Browser Xoay Nhoè Gục Load, NHƯNG Terminal Nảy Chữ ✨ Kết Nối Vỏ Ốp Đã Thông Một Vị Khách! XONG! Thiết Bị Đã Vướng Xích Bấu Trúng Đầu API Nhượng TCP Thô Tục. Ta đã Khai Cống Web Thành Cấp 1 Nhất Phẩm!
2. Tiêm Rút Mạch Máu Của Người Đến Trích Kích Lõi HTTP (Read Stream)
Socket Giao Thoa Liên Trội Bằng Kiểu Nước 2 Chiều. Mảng Dữ Liệu Túa Ra Dòng HTTP Chọc Ống Cứng Mũi Tên Dài. Cần Bọc Vọt Phơi Sạch Nằm Viết Ra Rổ Đọc Mực.
use std::io::{BufRead, BufReader}; // Móc Tính Mới Dải Đọc Lệnh Nhanh
use std::net::{TcpListener, TcpStream};
fn xu_ly_khach(mut r_stream: TcpStream) {
let doc_thui = BufReader::new(&mut r_stream);
// Tóm Mảng Vị Trí Data HTTP Đổ Tới Rả Chắp Xuống Trượt Lặp
let chuoi_http_vua_den: Vec<_> = doc_thui
.lines() // Cứa Kẽ Ống \n Từng Cọng Từng Cọng Cáp Đứt
.map(|ket_qua| ket_qua.unwrap()) // Closures Thọc Match Tách Lõi Lấy Cốt Chữ Code String
.take_while(|dong_chu| !dong_chu.is_empty()) // Header HTTP Xong Cứ Bọc Khoảng Dấu Kẽ Cách, Rọc Khớp Giữ Header Nghẽn Body!
.collect(); // Lấn Bỏ Tụ Thành Tập Hợp Mảng.
println!("Chi Chiết Request Khách Phun Vô Mõm:\n{:#?}", chuoi_http_vua_den);
}
// Tại Mục Số (2) Hàm Main Đổi Tên Lệnh Sang GỌI xu_ly_khach(stream);Restart Bệ. Bấm Chrome Tải Lại Link. Bạn Dòm Nhận Mẻ Text Array Dài Quãng Đủ Cờ Mã Request HTTP Về Tụi User-Agent Chấp Mảng GET / HTTP/1.1. Cậu Xong Cửa Báo Mũi. Không Cần AI Cày Khung.
Sẵn sàng cho Ngày 26? Web Của Bạn Xoay Chóng Chóng Mãi Trắng Phễu Vì Mãi Chưa Trả Cọc HTML Text Về Báo Tín Giành Băng Chuyền Máy Khách. Chờ Mạch Chi Hồi Trả Bát Gắn Response 200 OK Ở Dịp Tiếp: [Day 26: Ghép Phá Mã Response & Nở Rộ HTML Phản Chiếu].
Chuỗi bài viết
30 Ngày Trở Thành Rustacean Tinh Hoa
Phần 25 / 30
- Phần 1 30 Ngày học Rust - Day 1: Lời chào thế giới và Vũ khí Cargo
- Phần 2 30 Ngày học Rust - Day 2: Biến, Bất biến (Mutability) và Shadowing
- Phần 3 30 Ngày học Rust - Day 3: Luồng điều khiển (Control Flow) và sức mạnh của Match
- Phần 4 30 Ngày học Rust - Day 4: Ownership - Khái niệm định hình cỗ thần khí Rust
- Phần 5 30 Ngày học Rust - Day 5: Khóa học nhặt đồ chung với References & Borrowing
- Phần 6 30 Ngày học Rust - Day 6: Đắp nặn dự án với Structs và Methods
- Phần 7 30 Ngày học Rust - Day 7: Quyền năng vô song của Enums và Pattern Matching
- Phần 8 30 Ngày học Rust - Day 8: Quản lý dự án với Packages, Crates và Modules
- Phần 9 30 Ngày học Rust - Day 9: Các bộ sưu tập chung (Vectors, Strings, Hash Maps)
- Phần 10 30 Ngày học Rust - Day 10: Trị dứt điểm Ác mộng Lỗi (Error Handling)
- Phần 11 30 Ngày học Rust - Day 11: Generics - Ma thuật Đa hình kiểu dữ liệu
- Phần 12 30 Ngày học Rust - Day 12: Traits - Kẻ ban phát quyền năng và Lập pháp Hành vi
- Phần 13 30 Ngày học Rust - Day 13: Vượt qua Boss cuối 'Lifetimes' - Sinh Mệnh Biến
- Phần 14 30 Ngày học Rust - Day 14: Tận diệt Bug từ trứng nước bằng Automated Tests
- Phần 15 30 Ngày học Rust - Day 15: Thực chiến Build Command Line App (CLI) đầu đời
- Phần 16 30 Ngày học Rust - Day 16: Functional Magic chốn trần gian (Closures & Iterators)
- Phần 17 30 Ngày học Rust - Day 17: Quyền năng của Smart Pointers
- Phần 18 30 Ngày học Rust - Day 18: Chinh phục Da luồng (Concurrency) - Cú đâm quyết định của Rust
- Phần 19 30 Ngày học Rust - Day 19: Tranh cãi Lập trình hướng đối tượng (OOP) trong Rust
- Phần 20 30 Ngày học Rust - Day 20: Mổ xẻ nghệ thuật Advanced Pattern Matching
- Phần 21 30 Ngày học Rust - Day 21: Sức mạnh tối thượng của Advanced Traits
- Phần 22 30 Ngày học Rust - Day 22: Về Phe Bóng Tối với Unsafe Rust
- Phần 23 30 Ngày học Rust - Day 23: Quyền năng của Đấng Tạo Hóa (Declarative Macros)
- Phần 24 30 Ngày học Rust - Day 24: Siêu Năng Lực Procedural Macros (Macro Thủ Tục)
- Phần 25 30 Ngày học Rust - Day 25: Xây dựng TCP Web Server Đa Luồng (Phần 1: Lõi Socket)
- Phần 26 30 Ngày học Rust - Day 26: Xây dựng TCP Web Server Đa Luồng (Phần 2: Bắn trả File HTML)
- Phần 27 30 Ngày học Rust - Day 27: Xây dựng TCP Web Server Đa Luồng (Phần 3: The Thread Pool)
- Phần 28 30 Ngày học Rust - Day 28: Xây dựng TCP Web Server Đa Luồng (Phần 4: Graceful Shutdown)
- Phần 29 30 Ngày học Rust - Day 29: Lên đỉnh Web Server Thực Chiến với Axum và Tokio
- Phần 30 30 Ngày học Rust - Day 30: Vượt Vọng Vàng - Đúc Kết Hành Trình Rustacean Tinh Hoa