Có cách nào để PUSH dữ liệu từ máy chủ web đến trình duyệt không?


134

Tất nhiên tôi biết về Ajax, nhưng vấn đề với Ajax là trình duyệt nên thăm dò máy chủ thường xuyên để tìm xem có dữ liệu mới hay không. Điều này làm tăng tải máy chủ.

Có phương pháp nào tốt hơn (thậm chí sử dụng Ajax) ngoài việc thăm dò máy chủ thường xuyên không?


1
Tôi không chắc là có. Để làm cho nó đơn giản hơn về mặt khái niệm cho ứng dụng, tôi đoán bạn có thể triển khai một lớp vận chuyển bên trên các yêu cầu bỏ phiếu, và do đó loại bỏ trách nhiệm bỏ phiếu khỏi logic ứng dụng của bạn. Có lẽ ai đó thậm chí đã thực hiện điều này? <strong> Chỉnh sửa: </ strong> Rõ ràng nó được gọi là <a href=" en.wikipedia.org/wiki/Reverse_Ajax"> Ajax ngược </a> và <a href = " en.wikipedia.org/wiki/Comet_ ( lập trình) "> Sao chổi </ a >, nhưng cho đến nay có vẻ như bạn phải tự thực hiện nó. Một thư viện JavaScript cho điều này, bất cứ ai?
Anders Sandvig

1
@Rachel - Cập nhật trực tiếp để bạn có thể thấy những gì người khác đang làm. Tốt cho các trang web như StackOverflow và cho các ứng dụng web để cộng tác như tài liệu của Google.
Itai Bar-Haim

1
Bất cứ ai làm điều này trong năm 2016 có thể sẽ thấy websockets là một lựa chọn tốt hơn cho loại giao tiếp này.
Bóng tối

Câu trả lời:



37

Vâng, nó được gọi là Reverse Ajax hoặc Comet . Comet về cơ bản là một thuật ngữ ô cho các cách khác nhau để mở các yêu cầu HTTP tồn tại lâu dài để đẩy dữ liệu theo thời gian thực lên trình duyệt web. Tôi muốn giới thiệu StreamHub Push Server , họ có một số bản demo tuyệt vời và việc bắt đầu với nó dễ dàng hơn nhiều so với bất kỳ máy chủ nào khác. Hãy xem Hướng dẫn bắt đầu với Comet và StreamHub để có phần giới thiệu nhanh. Bạn có thể sử dụng Phiên bản cộng đồng có sẵn để tải xuống miễn phí nhưng giới hạn ở 20 người dùng đồng thời. Phiên bản thương mại rất đáng để hỗ trợ một mình cộng với việc bạn có bộ điều hợp máy khách SSL và máy tính để bàn .NET và Java. Trợ giúp có sẵn thông qua Google Group, có một loạt các hướng dẫn tốt trên mạng và cũng có một bộ chuyển đổi Comet GWT .


1
Chắc chắn là con đường phải đi, một khi bạn tự mình thực hiện nó, bạn sẽ nhận ra mình phải làm bao nhiêu - kết nối lại, bỏ phiếu dài, phát trực tuyến iframe, hỗ trợ trình duyệt chéo, HTTPS ...
Corehpf

2
Một lời giải thích về những gì Comet sẽ giúp câu trả lời này
Kevin Monk

1
@Satir: thêm một lời giải thích nhanh chóng. Các câu trả lời khác có liên kết đến bài viết Wikipedia.
Nosrama

32

Ngày nay bạn nên sử dụng WebSockets. Đây là tiêu chuẩn năm 2011 cho phép bắt đầu các kết nối với HTTP và sau đó nâng cấp chúng lên giao tiếp dựa trên thông điệp máy chủ-máy khách hai chiều.

Bạn có thể dễ dàng bắt đầu kết nối từ javascript:

var ws = new WebSocket("ws://your.domain.com/somePathIfYouNeed?args=any");
ws.onmessage = function (evt) 
{
  var message = evt.data;
  //decode message (with JSON or something) and do the needed
};

Việc xử lý phía sever phụ thuộc vào ngăn xếp của bạn.


2
Các sự kiện được gửi bởi máy chủ: stackoverflow.com/questions/5195452/
Mạnh

8
Tôi hoàn toàn đồng ý ... Sử dụng HTTP để liên lạc hai chiều giống như suy nghĩ trong các cuộc gọi REST để khiến Mario nhảy lên mai rùa ... đó là sự điên rồ. Bạn KHÔNG CẦN đưa ra yêu cầu và chờ phản hồi cho nút đơn giản đẩy mọi người .... Bạn chỉ không. HTTP là một giao thức tài liệu. Giao thức truyền siêu văn bản. Ajax Push là một cách cực kỳ phức tạp để phá vỡ HTTP để thực hiện những gì WebSocket thực hiện theo thiết kế. Ngừng trở nên ngớ ngẩn và sử dụng công cụ phù hợp cho công việc.
Nick Steele

bạn thực sự thích dấu chấm lửng, và đôi khi là một dạng bốn chấm mới mà tôi sẽ gọi là "dấu chấm lửng"!
imbatman

10

Nhìn vào Comet (một trò giả mạo về thực tế rằng Ajax là một tác nhân dọn dẹp và Comet cũng vậy) về cơ bản là "Ajax đảo ngược". Xin lưu ý rằng điều này yêu cầu kết nối máy chủ tồn tại lâu dài cho mỗi người dùng để nhận thông báo, vì vậy hãy lưu ý đến ý nghĩa hiệu suất khi viết ứng dụng của bạn.

http://en.wikipedia.org/wiki/Comet_( lập trình)



5

Tôi thực sự khuyên bạn nên đầu tư một chút thời gian vào Comet, nhưng tôi không biết thư viện hoặc triển khai thực tế mà bạn có thể sử dụng.

Đối với một loại "bảng điều khiển cuộc gọi" của một ứng dụng web có liên quan đến việc cập nhật trạng thái đại lý và hàng đợi cuộc gọi cho một Callcenter trực tiếp, chúng tôi đã phát triển một giải pháp nội bộ hoạt động, nhưng cách xa thư viện bạn có thể sử dụng.

Những gì chúng tôi đã làm là triển khai một dịch vụ nhỏ trên máy chủ nói chuyện với hệ thống điện thoại, chờ đợi các sự kiện mới và duy trì một bức ảnh về tình huống này. Dịch vụ này cung cấp một máy chủ web nhỏ.

Các máy khách web của chúng tôi kết nối qua HTTP với máy chủ web này và yêu cầu ảnh cuối cùng (được mã hóa bằng XML), hiển thị nó và sau đó đi lại, yêu cầu ảnh mới. Máy chủ web tại thời điểm này có thể:

  • Trả lại ảnh mới, nếu có
  • Chặn khách hàng trong vài giây (30 trong thiết lập của chúng tôi) chờ đợi một sự kiện nào đó xuất hiện và thay đổi ảnh. Nếu không có sự kiện nào được tạo tại thời điểm đó, nó sẽ trả về cùng một bức ảnh, chỉ cho phép kết nối tồn tại và không hết thời gian của máy khách.

Bằng cách này, khi khách hàng bỏ phiếu, nó sẽ nhận được phản hồi trong tối đa 0 đến 30 giây. Nếu một sự kiện mới đã được tạo, nó sẽ lấy nó ngay lập tức), nếu không thì nó sẽ chặn cho đến khi sự kiện mới được tạo.

Về cơ bản là bỏ phiếu, nhưng nó bỏ phiếu hơi thông minh để không làm quá nóng máy chủ web. Nếu Comet không phải là câu trả lời của bạn, tôi chắc chắn điều này có thể được thực hiện bằng cách sử dụng cùng một ý tưởng nhưng sử dụng AJAX hoặc mã hóa rộng rãi hơn trong JSON để có kết quả tốt hơn. Điều này đã được thiết kế thời kỳ tiền AJAX, vì vậy có rất nhiều chỗ để cải thiện.

Nếu ai đó có thể cung cấp một thực hiện nhẹ thực tế này, tuyệt vời!


5

Một thay thế thú vị cho Comet là sử dụng ổ cắm trong Flash.




2

Có những phương pháp khác. Không chắc chắn nếu họ "tốt hơn" trong tình huống của bạn. Bạn có thể có một applet Java kết nối với máy chủ khi tải trang và chờ đợi thứ được gửi bởi máy chủ. Nó sẽ chậm hơn một chút khi khởi động, nhưng sẽ cho phép trình duyệt nhận dữ liệu từ máy chủ trên cơ sở không thường xuyên, mà không cần bỏ phiếu.


2

Bạn có thể sử dụng ứng dụng Flash / Flex trên máy khách với BlazeDS hoặc LiveCycle ở phía máy chủ. Dữ liệu có thể được đẩy đến máy khách bằng kết nối RTMP. Xin lưu ý rằng RTMP sử dụng cổng không chuẩn. Nhưng bạn có thể dễ dàng quay lại bỏ phiếu nếu cổng bị chặn.


2

Bạn có thể đạt được những gì bạn đang nhắm đến thông qua việc sử dụng các kết nối http liên tục.

Kiểm tra bài viết Comet trên wikipedia, đó là một nơi tốt để bắt đầu.

Bạn sẽ không cung cấp nhiều thông tin nhưng nếu bạn đang xem xét việc xây dựng một loại trang web hướng sự kiện nào đó (a'la digg spy) hoặc một cái gì đó dọc theo đó có lẽ bạn sẽ xem xét việc triển khai IFRAME ẩn kết nối với một url nơi kết nối không bao giờ đóng và sau đó bạn sẽ đẩy các thẻ script từ máy chủ đến máy khách để thực hiện các cập nhật.



1

Khi một kết nối được mở tới máy chủ, nó có thể được mở và máy chủ có thể Đẩy nội dung từ lâu tôi đã làm với việc sử dụng multipart/x-mixed-replacenhưng điều này không hoạt động trong IE.

Tôi nghĩ rằng bạn có thể thực hiện công cụ thông minh với việc bỏ phiếu làm cho nó hoạt động giống như đẩy hơn bằng cách không gửi tiêu đề không thay đổi nội dung mà để kết nối mở nhưng tôi chưa bao giờ làm điều này.





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.