Máy khách WebSocket trong Python là gì?

“WebSocket là một giao thức giao tiếp máy tính, cung cấp các kênh giao tiếp song công hoàn toàn qua một kết nối TCP duy nhất. ” - Wikipedia

Trong phần này, bạn sẽ tìm hiểu cách thiết lập WebSocket của mình trong Python bằng API WebSockets

API Websocket giúp phiên giao tiếp tương tác hai chiều giữa máy khách và máy chủ trở nên khả thi. Với API, bạn có thể gửi và nhận tin nhắn theo cách thức hướng sự kiện mà không cần phải luôn thăm dò dữ liệu của máy chủ. Điều này dẫn đến ít chi phí hơn và cho phép truyền dữ liệu theo thời gian thực từ và đến máy chủ

Bắt đầu

WebSocket yêu cầu Python ≥ 3. 6. 1

Bạn có thể chỉ cần cài đặt API WebSockets trong Python bằng lệnh sau

pip install websockets

Sau khi đọc xong phần này, bạn sẽ hiểu chính xác WebSocket là gì. Tôi sẽ cung cấp cho bạn một ví dụ trung gian trong đó máy chủ đồng bộ hóa tất cả các thông báo mà nó nhận được với các máy khách được kết nối của nó

Tôi sẽ không động đến các chủ đề như bảo mật — mọi thứ tôi trình bày sẽ được viết bằng Python. Nó sẽ đủ đơn giản để hiểu cho tất cả mọi người ít nhất là một chút quen thuộc với ngôn ngữ này hoặc với lập trình nói chung. Bằng cách này, bạn sẽ dễ dàng viết người tiêu dùng, nhà sản xuất hoặc thậm chí máy chủ bằng ngôn ngữ khác hoặc cho ứng dụng giao diện người dùng

Tôi hy vọng bạn sẽ thấy các ví dụ được cung cấp hữu ích và tôi khuyến khích mọi nhà phát triển ngoài kia hãy dùng thử WebSocket ít nhất một lần trong sự nghiệp của bạn — thật tuyệt vời. Có nhiều hơn REST, bạn biết đấy

Một thông điệp đơn giản

Một thông điệp đơn giản người tiêu dùng

Vì vậy, trước tiên, hãy bắt đầu với tiêu thụ coroutine mà tôi cung cấp ở trên. Tôi sẽ giải thích từng dòng mã ở trên để bạn hiểu điều gì xảy ra tốt. Để tóm tắt ngắn gọn những gì đang xảy ra ở trên. Chúng tôi kết nối với WebSocket được chỉ định bởi một URL WebSocket cụ thể. Mọi thông báo được tạo bởi máy chủ WebSocket đều được ghi lại

Bây giờ tôi sẽ giải thích chi tiết ba dòng quan trọng nhất. Vui lòng bỏ qua phần này nếu bạn không quan tâm đến đường cú pháp

Bạn có thể hơi kinh hoàng nếu chưa từng thấy từ khóa

websocket_resource_url = f"ws://{host}:{port}"
2 hoặc
websocket_resource_url = f"ws://{host}:{port}"
3 trước đây.
websocket_resource_url = f"ws://{host}:{port}"
4 chỉ là một cú pháp đặc biệt để làm việc với các lời hứa một cách thoải mái. Một lời hứa không gì khác hơn là một đối tượng đại diện cho sự hoàn thành hoặc thất bại cuối cùng của một hoạt động không đồng bộ

Bạn có thể đính kèm các cuộc gọi lại vào đối tượng được trả về này thay vì thay thế cho việc chuyển các cuộc gọi lại vào một hàm. Bạn sẽ ngạc nhiên về mức độ dễ hiểu và sử dụng của nó

Trong Python,

websocket_resource_url = f"ws://{host}:{port}"
2 đảm bảo một hàm trả về một lời hứa và bao bọc những điều không hứa hẹn trong đó. Trong cuộc gọi
websocket_resource_url = f"ws://{host}:{port}"
3, mã không liên quan khác có thể thực thi

websocket_resource_url = f"ws://{host}:{port}"

URL tài nguyên WebSocket sử dụng sơ đồ của nó bắt đầu bằng

websocket_resource_url = f"ws://{host}:{port}"
1 (hoặc
websocket_resource_url = f"ws://{host}:{port}"
2 cho kết nối an toàn). Tiếp theo là tên máy chủ và số cổng (e. g. , ws. //websocket. ví dụ. com. 8400). Tôi đang sử dụng f-string để xây dựng URL tài nguyên tại đây. Cú pháp tương tự như cú pháp bạn đã sử dụng với
websocket_resource_url = f"ws://{host}:{port}"
3, nhưng chuỗi f được thêm vào trong Python 3. 6 và làm cho việc định dạng một chuỗi ký tự ít dài dòng hơn một chút

async with websockets.connect(websocket_resource_url) as ws:

Dòng tiếp theo tôi đang giải thích sẽ mở kết nối với WebSocket bằng cách sử dụng

websocket_resource_url = f"ws://{host}:{port}"
4. Đang chờ kết nối mang lại một
websocket_resource_url = f"ws://{host}:{port}"
5, sau đó có thể được sử dụng để gửi và nhận tin nhắn. Dòng này sử dụng
websocket_resource_url = f"ws://{host}:{port}"
6, hoạt động với trình quản lý ngữ cảnh không đồng bộ. Kết nối bị đóng khi thoát khỏi ngữ cảnh

Ghi chú. Đôi khi tôi đã sử dụng cách viết tắt của WebSocket (ws) để làm cho các ví dụ về mã dễ đọc hơn trên Phương tiện nhưng luôn viết tên đầy đủ trong mã sản xuất. Điều này làm tăng khả năng đọc. Chẳng hạn, người ta có thể đọc nó dưới dạng WebSite hoặc WebServer, đây là điều bạn nên ngăn chặn với tư cách là một nhà phát triển giỏi. Rốt cuộc, mã nên đọc như một cuốn sách hay

async for message in websocket:

Bạn có thể nghĩ, "Đợi đã,

websocket_resource_url = f"ws://{host}:{port}"
7 làm gì?"

IO không đồng bộ cho phép chúng tôi lặp qua trình lặp không đồng bộ. Điều này cho phép bạn gọi mã không đồng bộ ở mỗi giai đoạn khi nó được lặp lại, trong khi vòng lặp for thông thường sẽ không cho phép bạn làm như vậy. Bạn có thể xem WebSocket trong dòng mã này dưới dạng trình tạo thông báo

Để chạy trình tiêu dùng đơn giản này, chỉ cần chỉ định tên máy chủ và cổng và làm cho nó chạy mãi mãi. Nó đơn giản mà. Đừng lo lắng nếu không có vòng lặp sự kiện,

websocket_resource_url = f"ws://{host}:{port}"
8 sẽ tạo một vòng lặp sự kiện mới và đặt nó làm vòng lặp hiện tại

Điều đó thật đơn giản phải không? . //máy chủ cục bộ. 4000. Nếu không có máy chủ nào chạy, nó sẽ bị lỗi và báo lỗi 404 Not Found

Nhà sản xuất đơn giản

Tôi sẽ đưa ra một ví dụ về nhà sản xuất chỉ tạo ra một giá trị. Tôi sẽ cho bạn thấy điều này thậm chí còn dễ hơn viết một người tiêu dùng

Nhà sản xuất đơn giản

Đoạn mã trên nói cho chính nó. Chúng tôi kết nối với WebSocket, giống như chúng tôi đã làm trước đó trong ứng dụng khách. Chúng tôi gửi một tin nhắn đến máy chủ và chúng tôi đang chờ phản hồi. Khi chúng tôi nhận được tin nhắn từ máy chủ, chúng tôi biết rằng tin nhắn của bạn đã được gửi

Bây giờ, chúng ta chỉ cần một cách để thực hiện quy trình sản xuất này một lần duy nhất

websocket_resource_url = f"ws://{host}:{port}"
2

Tất nhiên, chúng tôi đặt tên cho nó và Python có câu trả lời cho nó. Chúng ta có thể chỉ cần sử dụng vòng lặp sự kiện giống như cách chúng ta đã làm với người tiêu dùng. Sự khác biệt duy nhất là chúng tôi chạy nó cho đến khi nó hoàn thành. Ngay khi chúng tôi nhận được phản hồi từ máy chủ, nhiệm vụ đã hoàn thành

Trong Trăn 3. 7, nó thậm chí còn tốt hơn — giờ đây chúng ta có thể sử dụng hàm run để thực thi coroutine. Khá gọn gàng, phải không?

websocket_resource_url = f"ws://{host}:{port}"
3

máy chủ. Mảnh ghép cuối cùng

Trong trường hợp này, tôi đã viết một lớp máy chủ nhóm tất cả các chức năng của máy chủ lại với nhau. Máy chủ này phân phối các tin nhắn được gửi bởi nhà sản xuất tới tất cả người tiêu dùng đang nghe

Máy chủ được khởi tạo và định nghĩa một quy trình xử lý WebSocket. Hàm

websocket_resource_url = f"ws://{host}:{port}"
9 của WebSocket là một trình bao bọc xung quanh phương thức
async with websockets.connect(websocket_resource_url) as ws:
0 của vòng lặp sự kiện. Nó tạo và khởi động một máy chủ với
async with websockets.connect(websocket_resource_url) as ws:
0. Nó lấy một trình xử lý WebSocket làm đối số

Bất cứ khi nào máy khách kết nối, máy chủ sẽ chấp nhận kết nối, tạo một

async with websockets.connect(websocket_resource_url) as ws:
2, thực hiện bắt tay mở và ủy quyền cho trình xử lý kết nối được xác định bởi ws_handler. Khi trình xử lý này hoàn tất, bình thường hoặc có ngoại lệ, máy chủ sẽ thực hiện thao tác đóng và đóng kết nối

Tất cả điều này được thực hiện cho bạn. Vì chúng tôi chỉ định máy chủ phải chạy mãi mãi, nên nó sẽ chỉ thực thi quy trình đăng ký

async with websockets.connect(websocket_resource_url) as ws:
3 được xác định trong lớp máy chủ (điều đó được giải thích bên dưới) mỗi khi nhà sản xuất của chúng tôi tạo ra thứ gì đó. Sau đó, nó sẽ phân phối một thông báo tới tất cả các máy khách được kết nối

Đoạn mã cuối cùng là đoạn mã dài nhất, nhưng nó là phần cuối cùng nên hãy chờ đợi

Lớp máy chủ đồng bộ hóa tin nhắn với máy khách được kết nối

async with websockets.connect(websocket_resource_url) as ws:
3 đăng ký một máy khách phân phối tin nhắn cho các máy khách được kết nối và cuối cùng, đóng kết nối. Người tiêu dùng sẽ duy trì kết nối, trong khi nhà sản xuất, mặt khác, tự hủy đăng ký. Quy trình đăng ký
async with websockets.connect(websocket_resource_url) as ws:
5 sẽ gửi mọi thông báo trong WebSocket tới tất cả các máy khách trong tập hợp các máy khách được kết nối của chúng tôi

Nếu có bất kỳ máy khách nào được kết nối, đoạn mã sau sẽ được thực thi.

async with websockets.connect(websocket_resource_url) as ws:
6 đảm bảo rằng chúng tôi chỉ tiếp tục sau khi mọi khách hàng đã được gửi tin nhắn

Máy khách WebSocket là gì?

WebSocket cho phép các phiên giao tiếp tương tác hai chiều giữa máy khách và máy chủ mà không cần phải thăm dò ý kiến ​​phản hồi của máy chủ , cung cấp cả cải tiến về tốc độ và .

WebSocket hoạt động như thế nào trong Python?

Giao thức WebSocket hoạt động trước tiên bằng cách tạo bắt tay và sau đó tạo khung thông báo được triển khai qua TCP thay vì HTTP cơ bản . WebSockets và các công nghệ tương tự khác như SSE (Sự kiện do máy chủ gửi) và WebRTC rất hữu ích trong các ứng dụng mà máy chủ cần giữ kết nối mở với các máy khách được kết nối.

Máy chủ và máy khách WebSocket là gì?

Máy chủ WebSocket không gì khác hơn là một ứng dụng lắng nghe trên bất kỳ cổng nào của máy chủ TCP tuân theo một giao thức cụ thể . Nhiệm vụ tạo một máy chủ tùy chỉnh có xu hướng khiến mọi người sợ hãi; .

Làm cách nào để xây dựng ứng dụng khách WebSocket bằng Python?

Ứng dụng khách WebSocket với Python . py” và nhập các gói như chúng ta đã làm trong mã máy chủ Create a new File “client.py” and import the packages as we did in our server code . Bây giờ, hãy tạo một hàm không đồng bộ Python (còn gọi là coroutine). kiểm tra xác định không đồng bộ (). Chúng tôi sẽ sử dụng chức năng kết nối từ mô-đun WebSockets để xây dựng kết nối máy khách WebSocket.