Lập trình mạng Python: giao thức TCP (phần 10)

Một client và server TCP đơn giản (tiếp tục)

Đó là tại sao lời gọi recv() phải ở bên trong một loop. Hệ điều hành không có cách nào biết rằng client và server
đơn giản này đang sử dụng các thông điệp 16 – octet độ rộng cố định. Vì nó không thể đoán khi nào dữ liệu đi đến có
thể cuối cùng tổng lại tới cái chương trình của bạn sẽ xem xét một thông điệp hoàn chỉnh, nó cung cấp bạn bất cứ
thứ dữ liệu gì nó có thể sớm như có thể.
Tại sao Python Standard Library bao gồm senall() nhưng không có tương ứng cho phương thức recv()? Nó là có thể vì các
thông điệp độ dài cố định không phổ biến ngày nay. Hầu hết các giao thức có các quy tắc phức tạp xa hơn về phần của
dòng đi vào bị bỏ gianh giới như thế nào hơn là một quyết định đơn giản rằng “thông điệp luôn là dài 16 bytes”. Trong
hầu hết các chương trình thế giới thực, loop cái chạy recv() là phức tạp hơn cái trong phần code trên, vì một chương
trình thường phải đọc hay xử lí phần của thông điệp trước khi nó có thể đoán nhiều hơn bao nhiêu đang đến. Ví dụ,
một trả lời HTTP chứa các headers, một dòng trắng, và sau đó bất cứ nhiều như thế nào các bytes dữ liệu thêm được
chỉ ra trpng header Content-Length. Bạn không biết bao nhiêu lần để giữ chạy recv() cho đến bạn bạn ít nhất đã nhận
được các headers và sau đó duyệt chúng để tìm ra content length, và loại chi tiết này tốt nhất để lại cho ứng dụng
của bạn thay vì Standard Library.

Chia sẻ