Sockets (tiếp tục)
Một khi socket đã được gắn thành công, server đã sẵn sàng bắt đầu nhận các requests nó
đi vào một loop và chạy lặp lại recvfrom(), thông báo lộ trình rằng nó sẽ vui nhận các thông
điệp lên tới độ dài tối đa 65,535 bytes – một giá trị cái tình cờ là độ dài lớn nhất cái
một UDP datagram có thể có, để rằng bạn sẽ luôn được thể hiện nội dung đầy đử của mỗi datagram.
Cho đến khi bạn gửi một thông điệp với một client,lời gọi recvfrom() của bạn sẽ chờ mãi mãi.
Một khi datagram đi đến, recvfrom() sẽ trả về địa chỉ của máy khách cái đã gửi bạn một datagram
cũng như các nội dung của datagram như các bytes. Sử dụng khả năng của Python để biên dịch các bytes
trực tiếp ra các strings, bạn in thông điệp tới console và sau đó trả về một datagram trả lời tới
client.
Nên, hãy khởi động client của chúng ta và thẩm định kết quả. Client code cũng được thể hiện trong
phần code trên.
(Tôi hi vọng, tiện thể rằng nó không gây nhầm lẫn rằng ví dụ này – như vài cái khác trong các học phần
– kết hợp server và client code thành một phần code đơn, được lựa chọn bởi các đối số command line. Tôi
thường thích hơn phong cách này vì nó giữ server và client logic gần lẫn nhau trên trình bày, và nó làm nó
dễ dàng hơn để xem đoạn code server nào đi với đoạn code client nào).
Trong khi server vẫn đang chạy, mở một command window khác trên hệ thống của bạn, và thử chạy client hai lần
trong một hàng giống cái này:
$ python udp_local.py client
The OS assigned me the address (‘0.0.0.0’, 46056)
The server (‘127.0.0.1’, 1060) replied ‘Your data was 46 bytes long’
$ python udp_local.py client
The OS assigned me the address (‘0.0.0.0’, 39288)
The server (‘127.0.0.1’, 1060) replied ‘Your data was 46 bytes long’
Trên command window của server, bạn sẽ thấy nó báo cáo mỗi kết nối cái nó phục vụ.
The client at (‘127.0.0.1’, 46056) says ‘The time is 2014-06-05 10:34:53.448338’
The client at (‘127.0.0.1’, 39288) says ‘The time is 2014-06-05 10:34:54.065836
Mặc dù client code là hơi đơn giản hơn cái của server – chỉ có 3 dòng của code mạng – nó giới thiệu hai khái niệm
mới. Lời gọi client tới sendto() cung cấp cả một thông điệp và một địa chỉ đich. Call đơn giản này
là tất cả cái là cần thiết để gửi một datagram đi tới theo con đường của nó tiến tới server. Nhưng,
tất nhiên, bạn cần một địa chỉ IP và số cổng, trên đầu cuối client, nếu bạn sẽ trao đổi thông tin.
Nên, hệ điều hành gán một cái tự động, như bạn thấy từ đầu ra của lời gọi tới getsockname(). Như đã
hứa, các số cổng client là mỗi cái từ phạm vi IANA cho các số cổng tạm thời (Ít nhất chúng là ở đây, trên
laptop của tôi, dưới Linux, dưới một hệ điều hành khác, bạn có thể nhận một kết quả khác).
Khi bạn đã thực hiện xong với server, bạn có thể tắt nó bằng cách ấn Ctrl+C trong terminal nơi nó đang chạy.