Trong hướng dẫn này, bạn sẽ học cách trao đổi dữ liệu giữa máy khách và máy chủ bằng cách sử dụng lập trình ổ cắm Python và API Socket. Sau đó, hướng dẫn này sẽ thảo luận về việc trao đổi dữ liệu trực tiếp giữa hai hoặc nhiều máy khách Python sử dụng nhà cung cấp dịch vụ lưu trữ. Mã nguồn được sử dụng trong hướng dẫn này có thể được tìm thấy trong kho lưu trữ GitHub .
Lập trình ổ cắm kết nối hai ổ cắm (ổ cắm máy khách và ổ cắm máy chủ) và cho phép chúng giao tiếp hai chiều trong thời gian thực. Kết nối ổ cắm trực tiếp có thể mang lại lợi ích cho tất cả các ứng dụng thời gian thực vì dữ liệu có thể được gửi hoặc nhận bất cứ lúc nào.
Bạn sẽ cần cài đặt phiên bản ổn định của Python phiên bản 3.x trên máy của mình. Nếu bạn là người dùng Windows, bạn có tùy chọn thêm Python vào PATH của mình.
Bạn cũng sẽ cần một trình soạn thảo mã để làm theo hướng dẫn này.
Visual Studio Code là trình chỉnh sửa mã nguồn mở và miễn phí phổ biến hỗ trợ nhiều ngôn ngữ và khung, bao gồm cả Python.
VSCode cũng hỗ trợ các tiện ích mở rộng cho Python để giúp hoàn thành và gỡ lỗi mã.
Hãy xây dựng một ứng dụng socket đơn giản bằng Python. Python cung cấp một lớp socket gốc (socket module), vì vậy các nhà phát triển không cần phụ thuộc vào các thư viện bên ngoài. Bắt đầu bằng cách thiết lập máy khách và máy chủ ổ cắm Python:
Tạo tệp client.py
trong thư mục dự án. Để sử dụng ổ cắm, hãy nhập thư viện ổ cắm Python và tạo một đối tượng ổ cắm mới kết nối với một địa chỉ IP được chỉ định (trong trường hợp này là localhost trên cổng số 8080, nhưng bạn có thể chọn bất kỳ địa chỉ ipv4 nào).
Tạo một kết nối mới đến máy chủ ổ cắm, gửi dữ liệu đến máy chủ TCP và đóng kết nối ổ cắm.
Tệp client.py
của bạn sẽ trông như thế này:
import socket client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('0.0.0.0', 8080)) client.send("I am CLIENT\n".encode()) from_server = client.recv(4096) client.close() print (from_server.decode())
Bạn sẽ cần một máy chủ socket để lắng nghe các kết nối và tin nhắn đến từ máy khách của mình.
Tạo tệp server.py
và thêm nội dung sau:
import socket serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) serv.bind(('0.0.0.0', 8080)) serv.listen(5) while True: conn, addr = serv.accept() from_client = '' while True: data = conn.recv(4096) if not data: break from_client += data.decode('utf8') print (from_client) conn.send("I am SERVER\n".encode()) conn.close() print ('client disconnected and shutdown')
Server.py
liên kết đối tượng ổ cắm với tên máy chủ (localhost) trên cổng 8080 và liên tục lắng nghe các kết nối máy khách mới. Khi một máy khách kết nối với địa chỉ này, máy chủ sẽ chấp nhận kết nối và đọc bất kỳ dữ liệu nào.
Khi dữ liệu được đọc thành công từ máy khách, máy chủ sẽ cung cấp phản hồi dữ liệu, tại thời điểm đó, máy khách sẽ kết thúc kết nối.
Để tự kiểm tra điều này, hãy mở đồng thời hai cửa sổ đầu cuối. Trong một cửa sổ, hãy chạy:
python3 server.py
Trong cửa sổ thứ hai, hãy chạy:
python3 client.py
Lưu ý rằng máy chủ tiếp tục chạy và sẽ thiết lập kết nối mới mỗi khi bạn chạy máy khách và nối thêm bất kỳ đầu ra mới nào.
Máy khách sẽ gửi chuỗi "I am CLIENT" đến máy chủ và đợi phản hồi. Máy chủ sẽ đọc tin nhắn của máy khách, xuất nó ra thiết bị đầu cuối và gửi lại phản hồi cho máy khách.
Cho đến nay, hướng dẫn này đã đề cập đến việc trao đổi tin nhắn giữa máy chủ và máy khách, nhưng nếu bạn cần giao tiếp trực tiếp giữa các máy khách Python thì sao?
Việc gửi dữ liệu trực tiếp giữa hai hoặc nhiều thiết bị khách rất phức tạp vì bạn phải cân nhắc nhiều vấn đề về quy mô và bảo mật khi số lượng thiết bị của bạn tăng lên.
Kiến trúc máy khách-máy chủ được sử dụng để kiểm duyệt và quản lý giao tiếp giữa máy khách với máy khách của bạn. Nếu bạn không có máy chủ web hoặc bạn lo lắng về việc mở rộng quy mô máy chủ của mình để đáp ứng nhu cầu của ứng dụng, thì bạn nên chọn giải pháp giao tiếp thời gian thực được lưu trữ trên máy chủ, chẳng hạn như PubNub .
SDK đa nền tảng của PubNub, bao gồm Python , có thể xác định người dùng và gửi thông báo đến các kênh cụ thể mà chỉ những khách hàng đã đăng ký mới nhận được.
Vì vậy, ứng dụng đơn giản đã trình bày trước đây sẽ được viết bằng PubNub để trao đổi tin nhắn trực tiếp giữa hai khách hàng như thế nào? Điều cần thiết là phải hiểu rằng mặc dù PubNub sử dụng kiến trúc 'xuất bản' và 'đăng ký' (pub/sub) để gửi và nhận tin nhắn hai chiều giữa các điểm cuối, nhưng nó vẫn sử dụng các ổ cắm đằng sau hậu trường. PubNub mang lại cho bạn những lợi ích của giao tiếp ổ cắm mà không phải lo lắng về các chi tiết của lập trình mạng Python và duy trì kết nối luôn bật giữa các máy khách của bạn bất kể hệ điều hành là gì.
Để tích hợp PubNub vào dự án, hãy cài đặt gói PubNub với pip trong thiết bị đầu cuối; điều này sẽ cho phép bạn sử dụng PubNub Python SDK và giao tiếp với cơ sở hạ tầng PubNub.
pip3 install 'pubnub>=7.1.0'
Bạn sẽ cần tạo hai ứng dụng khách để kết nối và giao tiếp qua mạng PubNub. Tạo một tệp pn_client_1.py
và thêm đoạn mã sau:
from pubnub.callbacks import SubscribeCallback from pubnub.enums import PNStatusCategory from pubnub.pnconfiguration import PNConfiguration from pubnub.pubnub import PubNub import time import os pnconfig = PNConfiguration() userId = os.path.basename(__file__) pnconfig.publish_key = 'demo' pnconfig.subscribe_key = 'demo' pnconfig.user_id = userId pnconfig.ssl = True pubnub = PubNub(pnconfig) def my_publish_callback(envelope, status): # Check whether request successfully completed or not if not status.is_error(): pass class MySubscribeCallback(SubscribeCallback): def presence(self, pubnub, presence): pass def status(self, pubnub, status): pass def message(self, pubnub, message): if message.publisher == userId : return print ("from device " + message.publisher + ": " + message.message) pubnub.add_listener(MySubscribeCallback()) pubnub.subscribe().channels("chan-1").execute() ## publish a message while True: msg = input("") if msg == 'exit': os._exit(1) pubnub.publish().channel("chan-1").message(str(msg)).pn_async(my_publish_callback)
Tạo tệp pn_client_2.py
và thêm mã giống như bạn đã sử dụng cho pn_client_1.py
Đoạn mã trên sử dụng các khóa 'demo', nhưng bạn có thể lấy miễn phí các khóa PubNub tùy chỉnh của mình.
Chạy đồng thời cả pn_client_1.py
và pn_client_2.py
trong hai cửa sổ đầu cuối khác nhau
python3 pn_client_1.py
python3 pn_client_2.py
Mỗi máy khách khởi tạo kết nối của nó với mạng PubNub và đăng ký nhận tin nhắn mới bất cứ khi nào chúng được xuất bản lên kênh chan-1
. Bạn có thể coi đây là việc gửi dữ liệu qua ổ cắm TCP trong Python; đằng sau hậu trường, PubNub đang tạo và quản lý ổ cắm cho bạn và định tuyến thông báo của bạn tới tất cả khách hàng đang lắng nghe nó. Khi máy khách từ xa nhận được tin nhắn, tin nhắn đã nhận được hiển thị trên dòng lệnh.
Và đó là tất cả để có nó! Để biết thêm thông tin về cách phát triển với PubNub, hãy xem loạt hướng dẫn của chúng tôi. Ngoài ra, hãy xem chuyến tham quan trực tiếp tương tác PubNub để hiểu cách nền tảng cung cấp khả năng tương tác thời gian thực cho các ứng dụng. PubNub hỗ trợ giao tiếp gói dữ liệu TCP và UDP, cũng như Linux, Unix và Windows.
Cũng được xuất bản tại đây: https://www.pubnub.com/blog/socket-programming-in-python-client-server-p2p/