2010-04-18 2 views
17

Tôi đang cố gắng hiểu cách tính năng trò chuyện của Facebook nhận tin nhắn mà không cần liên tục căn chỉnh máy chủ.Làm thế nào để trò chuyện Facebook tránh việc bỏ phiếu liên tục của máy chủ?

Firebug hiển thị cho tôi một lần GET XmlHttpRequest liên tục ngồi đó, chờ phản hồi từ máy chủ. Sau 5 phút, điều này không bao giờ hết thời gian chờ.

Chúng ngăn thời gian chờ như thế nào?

Yêu cầu AJAX chỉ có thể ngồi ở đó như vô thời hạn, chờ phản hồi?

Tôi có thể làm điều này với JSONRequest không? Tôi thấy điều này tại json.org:

JSONRequest được thiết kế để hỗ trợ các kết nối song song . Điều này cho phép các ứng dụng trong đó máy chủ có thể khởi tạo không đồng bộ một cách không đồng bộ. Điều này được thực hiện bằng cách sử dụng hai yêu cầu đồng thời : một yêu cầu gửi và một yêu cầu khác để nhận được. Bằng cách sử dụng tham số timeout , yêu cầu POST có thể được để lại cho đến khi máy chủ xác định rằng nó có dữ liệu kịp thời để gửi.

Hoặc có cách nào khác để gọi AJAX chỉ ngồi đó, chờ đợi, ngoài việc sử dụng JSONRequest không?

Trả lời

25

Facebook sử dụng kỹ thuật hiện được gọi là Comet để đẩy thư từ máy chủ đến máy khách thay vì yêu cầu máy khách thăm dò ý kiến ​​của máy chủ.

Có nhiều cách để thực hiện điều này, với XMLHttpRequest long polling chỉ là một tùy chọn. Nguyên tắc đằng sau phương thức này là máy khách gửi một XMLHttpRequest bình thường nhưng máy chủ không đáp ứng cho đến khi một sự kiện nào đó xảy ra (chẳng hạn như một người dùng khác gửi tin nhắn), vì vậy máy khách bị buộc phải đợi. Khi máy khách nhận được một phản hồi (hoặc nếu yêu cầu hết thời gian) máy khách chỉ cần tạo một yêu cầu mới để nó luôn có một yêu cầu mở tới máy chủ.

+0

Tôi chỉ thấy rằng nếu tôi tạo kết nối bỏ phiếu dài, máy Mac/máy tính của tôi sẽ không chuyển sang chế độ ngủ. Làm thế nào được thực hiện trên trò chuyện trong Gmail và Facebook? Hay họ cũng không ngủ được? (Bối rối.) – loveNoHate