Lập trình mạng Python: client – server (phần 9)

Một trao đổi trò chuyện mạng thô

HTTP không thể đơn giản gửi dữ liệu giữa hai máy sử dụng sóng, tất nhiên. Thay vào đó, giao
thức HTTP phải hoạt động bằng cách sử dụng một vài trừu tượng đơn giản hơn. Trên thực tế, nó
sử dụng năng lực của các hệ điều hành hiện đại để hỗ trợ một trao đổi trò chuyện mạng plain text
giữa hai chương trình khác nhau qua mạng IP bằng cách sử dụng giao thức TCP. Giao thức HTTP,nói
cách khác, hoạt động bằng cách ra lệnh chính xác text của thông điệp trông giống cái gì cái truyền
đi lại giữa 2 hosts cái có thể nói chuyện TCP.
Khi bạn di chuyển bên dưới HTTP để nhìn vào cái gì xảy ra dưới nó, bạn đi xuống mức thấp nhất của
network stack cái bạn vẫn có thể truy cập dễ dàng từ Python. Nhìn cẩn thận vào search4.py, như được
thể hiện trong phần code dưới đây. Nó tạo chính xác cùng request mạng tới Google Maps như 3 chương trình
trước, nhưng nó làm như vậy bằng cách gửi một thông điệp text thô qua Internet và nhận nhúm text trả lại.

Talking to Google Maps Through a Bare Socket
#!/usr/bin/env python3
# Foundations of Python Network Programming, Third Edition
# https://github.com/brandon-rhodes/fopnp/blob/m/py3/chapter01/search4.py
import socket
from urllib.parse import quote_plus
request_text = “””\
GET /maps/api/geocode/json?address={}&sensor=false HTTP/1.1\r\n\
Host: maps.google.com:80\r\n\
User-Agent: search4.py (Foundations of Python Network Programming)\r\n\
Connection: close\r\n\
\r\n\
“””
def geocode(address):
sock = socket.socket()
sock.connect((‘maps.google.com’, 80))
request = request_text.format(quote_plus(address))
sock.sendall(request.encode(‘ascii’))
raw_reply = b”
while True:
more = sock.recv(4096)
if not more:
break
raw_reply += more
print(raw_reply.decode(‘utf-8’))
if __name__ == ‘__main__’:
geocode(‘207 N. Defiance St, Archbold, OH’)

Trong di chuyển từ search3.py tới search4.py, bạn đã đi qua một ngưỡng quan trọng. Trong mỗi phần code chương trình trước, bạn sử dụng một thư viện Python – viết bằng bản thân Python – cái biết làm cách nào nói chuyện với một giao thức mạng phức tạp bản thân bạn. Nhưng ở đây, bạn đã đi đến đáy: bạn gọi hàm raw socket() cái được cung cấp bởi hệ điều hành host để hỗ trợ các trao đổi thông tin mạng cơ bản trên một mạng IP. Bạn đang, nói cách khác, sử dụng cùng cơ chế cái một lập trình viên hệ thống mức thấp sẽ sử dụng trong ngôn ngữ C khi viết cùng hoạt động mạng này.

Chia sẻ

Leave a Reply

Your email address will not be published. Required fields are marked *