Đẩy dữ liệu từ Máy chủ sang Máy khách mà không có yêu cầu của máy khách?


11

Tôi đã nhận thấy trong khi duyệt Stack Exchange rằng có các thông báo động như "3 tin nhắn mới, nhấp để hiển thị". Tôi muốn có loại cập nhật động này cho những gì tôi sắp giải thích.

Giả sử tôi muốn tạo một băng chuyền / slideshow gồm 10 bài báo gần đây. Tôi muốn băng chuyền này được cập nhật hàng giờ, trong một hàng đợi. Các bài viết mới hơn sẽ đẩy các bài viết cũ ra khỏi hàng đợi. Giải pháp ra khỏi đỉnh đầu của tôi sẽ là.

  1. Người dùng đăng nhập vào máy khách.
  2. Khách hàng tính toán số phút cho đến khi đánh dấu giờ tiếp theo và đặt bộ hẹn giờ để thực hiện vào giờ.
  3. Vào giờ, gửi yêu cầu đến máy chủ về bất kỳ bài viết tin tức mới nào chưa có trong băng chuyền.
  4. Xử lý phản ứng.
  5. Đặt lại bộ đếm thời gian.

Đây có phải là một chiến lược chấp nhận được? Tôi có thể đạt được điều này mà không cần dựa vào yêu cầu của khách hàng không? Nói cách khác, Stack Exchange đạt được cập nhật động như thế nào?


4
Hãy nhìn vào SignalR.
Robert Harvey

Tôi khuyên bạn nên đọc lên RSSAJAX để biết ý tưởng. RSS là một ví dụ về giao thức chuẩn cho các nguồn cấp dữ liệu đăng ký và AJAX là một khái niệm cấp cao về cách cập nhật máy khách (trình duyệt) mà không cần tải lại trang. Tôi cá là đây là cách Stack Exchange hoạt động.


Là khách hàng một trình duyệt, một khách hàng tùy chỉnh hoặc một cái gì đó khác?
outis

Đó là một phần thù địch của người dùng, nhưng bạn có thể có trang HTML tự làm mới sau mỗi 15 phút hoặc lâu hơn. Hầu hết các trang web tin tức làm điều này.
Gilbert Le Blanc

Câu trả lời:


7

Để đẩy dữ liệu, bạn phải xác định một Khách hàng và điều đó sẽ được thực hiện bằng cách đăng ký khách hàng vào máy chủ. Khi đã xong, bạn có một danh sách khách hàng đã đăng ký với một kết nối liên tục.

Tùy thuộc vào những gì bạn muốn đạt được, tôi nói rằng tốt nhất là khách hàng nên yêu cầu máy chủ, để bạn không phải duy trì kết nối liên tục và sử dụng các giao thức truyền thông yêu cầu / phản hồi như HTTP.

Một ví dụ xuất hiện trong đầu để duy trì kết nối liên tục sẽ là một hệ thống trò chuyện / nhắn tin tức thời trực tiếp, vì giao tiếp sẽ diễn ra theo thời gian thực.

Hãy nhớ rằng kết nối liên tục thường được thực hiện thông qua việc sử dụng sockets, điều này thêm một lớp phủ trong việc thực hiện giao thức truyền thông, mã hóa của riêng bạn, v.v ...


2

Về cơ bản, bạn cần đẩy dữ liệu đến máy khách và vì giao tiếp hai chiều không nằm trong phạm vi của giao thức http, nên việc tự mình thực hiện nó là không dễ dàng.

Giải pháp cho vấn đề của bạn là socket.io

Như trang web của nó tuyên bố,

"Socket.IO cho phép giao tiếp dựa trên sự kiện hai chiều thời gian thực. Nó hoạt động trên mọi nền tảng, trình duyệt hoặc thiết bị, tập trung như nhau vào độ tin cậy và tốc độ."

Hy vọng điều này sẽ giải quyết vấn đề của bạn.


7
Sẽ rất hữu ích, nếu bạn nêu nếu và cách bạn liên kết với socket.io và cách nó sẽ giúp giải quyết vấn đề của người hỏi dựa trên kiến ​​thức / kinh nghiệm của bạn với khung (ngược lại với "tuyên bố sứ mệnh" của trang web)
Benni

WebSockets hoàn toàn thích hợp hơn với Socket.IO khi tất cả các trình duyệt chính thực hiện tiêu chuẩn. Hầu hết các ngôn ngữ chính đều có triển khai websocket, nhưng không phải ngôn ngữ socket.io. Socket.io thêm cấu trúc bổ sung cho các tin nhắn, do đó, nó cũng không dễ tương thích.
Alex Reinking

1

Tôi không thể nói về cách SE làm điều đó mặc dù vì đây là một trang web nên có một số cách mà họ có thể bao gồm một công việc định kỳ được thiết lập để chạy tập lệnh php / asp / what-have-you vào giờ để đẩy dữ liệu. Nhưng điều này sẽ là nếu bạn đang tìm kiếm một giải pháp chỉ dành cho web.

Nhưng vì bạn đang đề cập đến một khách hàng, có lẽ bạn có thể tạo một tệp có ngày / giờ của bản cập nhật tin tức mới nhất cho khách hàng đó và để khách hàng kiểm tra giá trị được lưu trữ trong tệp đã nói và so sánh với thời gian hệ thống của người dùng để xem nếu một giờ đã vượt qua kể từ lần cập nhật cuối cùng. Nếu đã được ít nhất một giờ thì máy khách sẽ yêu cầu luồng tin tức mới nhất từ ​​máy chủ của bạn, sau đó trả về luồng tin tức mới nhất cho khách hàng.

Tôi sẽ tránh sử dụng bộ hẹn giờ hoặc ít nhất là chỉ sử dụng bộ hẹn giờ vì phương pháp đó chỉ hoạt động nếu người dùng giữ máy khách mở để duy trì bộ hẹn giờ. Nhưng nếu bạn (cũng) có tệp như tôi đề xuất thì bạn có thể tạo một chương trình con để mở tệp, lưu thời gian vào một biến và so sánh nó với thời gian hệ thống và thực hiện yêu cầu nếu nó đã ít nhất một giờ. Sau đó, bạn chỉ cần thực hiện cuộc gọi đến phụ liên quan đến các sự kiện nhất định. Tôi chắc chắn sẽ gọi nó khi tải biểu mẫu vì nếu người dùng chỉ khởi động lại máy khách của họ thì bạn sẽ muốn có tin tức mới nhất. Nếu đã được vài ngày kể từ khi họ ở trên máy khách thì nó sẽ hiển thị tin tức cũ. Trong ít nhất buộc phụ đó vào tải khách và khởi động bộ hẹn giờ như bạn đề xuất.

Tôi xin lỗi nếu tôi hiểu nhầm những gì bạn sẽ làm vì tôi không hoàn toàn chắc chắn những gì bạn sẽ làm. Nhưng hy vọng một trong hai cách có giá trị ở đây cho bạn!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.