Sử dụng các dòng TCP như các files
Vì TCP hỗ trợ các dòng dữ liệu, chúng đã có thể nhắc nhở bạn xong về các files thông thường, cái cũng hỗ trợ đọc và
viết dữ liệu chuỗi như các hoạt động cơ bản. Python làm một công việc tốt giữ các khái niệm này riêng rẽ. Các objects
file có thể read() và write(), trong khi các sockets chỉ có thể send() và recv(). Và không loại object nào có thể
làm cả hai. (Đây thực sự là một cái làm sạch cơ bản và chia tách khái niệm đóng gói hơn là được giành bởi giao diện
POSIX ở bên dưới, cái để một lập trình viên C gọi read() và write() trên một socket một cách vô tổ chức như thể nó là
một file descriptor thông thường.)
Nhưng đôi khi bạn sẽ muốn đối xử một socket như object file Python thông thường – thường là vì bạn muốn truyền nó tới
code giống cái đó, như nhiều Python modules như pickle, json, và zlib, có thể đọc và viết dữ liệu trực tiếp từ một file.
Cho mục đích này, Python cung cấp một phương thức makefile() trên mọi socket cái trả về một object file Python cái thực
sự đang gọi recv() và send() đằng sau hậu trường.
>>> import socket
>>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> hasattr(sock, ‘read’)
False
>>> f = sock.makefile()
>>> hasattr(f, ‘read’)
True
Các sockets trên hệ thống xuất phát từ Unix như Ubuntu và Mac OS X, như các files Python thông thường cũng có phương
thức fileno() cái cho phép bạn khám phá số file descriptor của chúng trong trường hợp bạn cần cung cấp nó tới lời gọi
mức thấp hơn. Bạn sẽ thấy cái này hữu dụng khi bạn khám phá select() và poll() trong học phần sau.