Websockets python so với websocket-client

WebSocket là một giao thức chuẩn để truyền dữ liệu hai chiều giữa máy khách và máy chủ. Giao thức WebSockets không chạy trên HTTP, thay vào đó, nó là một triển khai riêng biệt trên TCP

Tại sao nên sử dụng WebSockets?

Kết nối WebSocket cho phép giao tiếp song công hoàn toàn giữa máy khách và máy chủ để một trong hai bên có thể đẩy dữ liệu sang bên kia thông qua kết nối đã thiết lập. Lý do tại sao WebSockets, cùng với các công nghệ liên quan của sự kiện do máy chủ gửi [SSE] và kênh dữ liệu WebRTC, quan trọng là HTTP không có nghĩa là giữ kết nối mở cho máy chủ để thường xuyên đẩy dữ liệu tới trình duyệt web. Trước đây, hầu hết các ứng dụng web sẽ triển khai long polling thông qua các yêu cầu JavaScript và XML [AJAX] không đồng bộ thường xuyên như trong sơ đồ bên dưới

Đẩy máy chủ hiệu quả hơn và có thể mở rộng hơn so với bỏ phiếu dài vì trình duyệt web không phải liên tục yêu cầu cập nhật thông qua luồng yêu cầu AJAX

Trong khi sơ đồ trên cho thấy một máy chủ đẩy dữ liệu đến máy khách, WebSockets là một kết nối song công hoàn toàn nên máy khách cũng có thể đẩy dữ liệu đến máy chủ như trong sơ đồ bên dưới

Cách tiếp cận WebSockets dành cho các bản cập nhật do máy chủ và máy khách đẩy hoạt động tốt đối với một số danh mục ứng dụng web nhất định, chẳng hạn như phòng trò chuyện, đó là lý do tại sao đó thường là một ứng dụng mẫu cho thư viện WebSocket

Triển khai WebSockets

Cả trình duyệt web và máy chủ phải triển khai giao thức WebSockets để thiết lập và duy trì kết nối. Có ý nghĩa quan trọng đối với các máy chủ vì các kết nối WebSockets tồn tại lâu dài, không giống như các kết nối HTTP thông thường

Máy chủ dựa trên đa luồng hoặc đa quy trình không thể mở rộng quy mô phù hợp cho WebSockets vì nó được thiết kế để mở kết nối, xử lý yêu cầu nhanh nhất có thể và sau đó đóng kết nối. Một máy chủ không đồng bộ như Tornado hoặc khỉ Green Unicorn được vá bằng gevent là cần thiết cho bất kỳ triển khai phía máy chủ WebSockets thực tế nào

Về phía máy khách, không cần thiết phải sử dụng thư viện JavaScript cho WebSockets. Các trình duyệt web triển khai WebSockets sẽ hiển thị tất cả chức năng phía máy khách cần thiết thông qua đối tượng WebSockets

Tuy nhiên, thư viện trình bao bọc JavaScript có thể giúp cuộc sống của nhà phát triển trở nên dễ dàng hơn bằng cách triển khai sự xuống cấp nhẹ nhàng [thường quay trở lại quá trình bỏ phiếu dài khi WebSockets không được hỗ trợ] và bằng cách cung cấp một trình bao bọc xung quanh các yêu cầu WebSocket dành riêng cho trình duyệt. Các ví dụ về thư viện máy khách JavaScript và triển khai Python được hiển thị trong phần bên dưới

Ủy quyền Nginx WebSocket

Nginx chính thức hỗ trợ WebSocket proxy kể từ phiên bản 1. 3. Tuy nhiên, bạn phải định cấu hình các tiêu đề Nâng cấp và Kết nối để đảm bảo các yêu cầu được chuyển qua Nginx đến máy chủ WSGI của bạn. Có thể khó thiết lập điều này lần đầu tiên

Dưới đây là các cài đặt cấu hình tôi sử dụng trong tệp Nginx của mình như một phần của proxy WebSockets của tôi

# this is where my WSGI server sits answering only on localhost
# usually this is Gunicorn monkey patched with gevent
upstream app_server_wsgiapp {
  server localhost:5000 fail_timeout=0;
}

server {

  # typical web server configuration goes here

  # this section is specific to the WebSockets proxying
  location /socket.io {
    proxy_pass //app_server_wsgiapp/socket.io;
    proxy_redirect off;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 600;
  }
}

Lưu ý nếu bạn gặp phải bất kỳ sự cố nào với cấu hình ví dụ trên, bạn sẽ muốn tìm hiểu tài liệu mô-đun proxy HTTP chính thức

Các tài nguyên sau đây cũng hữu ích để thiết lập cấu hình đúng cách

Triển khai Python WebSockets

Các dự án sau triển khai WebSockets trong Python hoặc cung cấp mã ví dụ mà bạn có thể làm theo để sử dụng WebSockets trong các dự án của riêng mình

  • Autobahn sử dụng Twisted và asyncio để tạo thành phần WebSockets phía máy chủ trong khi AutobahnJS hỗ trợ phía trình duyệt web của khách hàng

  • Kênh Django được xây dựng dựa trên WebSockets và dễ dàng tích hợp với các dự án Django hiện có hoặc mới

  • Flask-SocketIO là một tiện ích mở rộng Flask dựa trên eventlet hoặc gevent để tạo các kết nối WebSockets phía máy chủ

  • websocket-client cung cấp API cấp thấp cho WebSockets và hoạt động với cả Python 2 và 3

  • xà ngang. io được xây dựng dựa trên Autobahn và bao gồm một máy chủ riêng biệt để xử lý các kết nối WebSockets nếu nhà phát triển ứng dụng web mong muốn

Thư viện máy khách JavaScript

JavaScript được sử dụng để tạo phía máy khách của kết nối WebSocket vì máy khách thường là một trình duyệt web. Mặc dù bạn không cần một trong các thư viện phía máy khách này để sử dụng WebSockets, nhưng chúng rất hữu ích để giảm thiểu số lượng mã soạn sẵn để thiết lập và xử lý các kết nối của bạn

  • Ổ cắm. thư viện JavaScript phía máy khách của io có thể được sử dụng để kết nối với triển khai WebSockets phía máy chủ

  • web-socket-js là một triển khai WebSockets phía máy khách dựa trên Flash

  • AutobahnJS hỗ trợ phía trình duyệt web của khách hàng

Mã ví dụ cho WebSockets trong Python

Có rất nhiều triển khai dựa trên Python cho WebSockets, vì vậy đôi khi, việc kiểm tra một ví dụ là dễ dàng nhất để bạn có thể xây dựng thứ gì đó cho dự án của riêng mình

  • Dự án Flask-SocketIO có một ứng dụng web trò chuyện trình diễn việc gửi các sự kiện do máy chủ tạo cũng như đầu vào từ người dùng thông qua đầu vào hộp văn bản trên một biểu mẫu

  • Ví dụ về python-websockets chứa mã để tạo một ứng dụng web đơn giản cung cấp WebSockets bằng Flask, Flask-SocketIO và gevent

Tài nguyên WebSockets dành riêng cho Python

  • Bài nói chuyện "Ứng dụng web Async Python với WebSockets & gevent" mà tôi đã trình bày tại San Francisco Python vào tháng 1 năm 2015 là một ví dụ được mã hóa trực tiếp về triển khai ứng dụng web Flask cho phép khán giả tương tác với WebSockets khi tôi xây dựng ứng dụng

  • Thời gian thực trong Python cung cấp ngữ cảnh dành riêng cho Python về cách triển khai các bản cập nhật đẩy máy chủ trong quá khứ và cách các công cụ của Python đã phát triển để thực hiện các bản cập nhật phía máy chủ

  • websockets là một triển khai WebSockets cho Python 3. 3+ được viết bằng mô-đun asyncio

  • Tăng tốc Websockets 60X là một thử nghiệm thú vị trong các vòng lặp mã hóa theo nhiều cách khác nhau để đạt được hiệu suất cao hơn từ các kết nối WebSockets. Không rõ kết quả trong bài đăng trên blog có thể khái quát hóa như thế nào đối với các chương trình khác nhưng đó là một ví dụ điển hình về cách điều chỉnh và điều chỉnh có thể tạo ra lợi nhuận vượt trội trong một số ứng dụng

  • Thêm thời gian thực vào ứng dụng Django cho biết cách sử dụng Django và Crossbar. io để triển khai tính năng xuất bản/đăng ký trong ứng dụng

  • Async with Bottle cho thấy cách sử dụng greenlet để hỗ trợ WebSockets với khung web Chai

  • Nếu bạn đang triển khai cho Heroku, có một hướng dẫn cụ thể về WebSockets để khởi động và chạy ứng dụng Python của bạn

  • Chủ đề Reddit cho trang này có một số nhận xét thú vị về những nội dung còn thiếu trong nội dung trên mà tôi đang cố gắng giải quyết

  • Tạo Websockets Trò chuyện bằng Python hiển thị mã cho máy chủ Twisted xử lý các kết nối WebSockets ở phía máy chủ cùng với mã JavaScript cho phía máy khách

  • Đồng bộ hóa ứng dụng khách của ứng dụng Flask với WebSockets là hướng dẫn nhanh về cách sử dụng Flask, tiện ích mở rộng Flask-SocketIO và Ổ cắm. IO để cập nhật giá trị giữa các máy khách trình duyệt web khi có thay đổi

Tài nguyên WebSockets chung

WebSockets hỗ trợ nhiều trình duyệt và do đó, nhiều khung web trên tất cả các ngôn ngữ lập trình chính đều có thư viện để tạo kết nối WebSockets dễ dàng hơn. Các tài nguyên sau đây là các hướng dẫn và hướng dẫn chung cung cấp ngữ cảnh cho giao thức mà không đi sâu vào cách sử dụng WebSockets trong Python

Chủ Đề