2008-08-21 11 views
122

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ò ý kiến ​​máy chủ thường xuyên để tìm xem liệu có dữ liệu mới hay không. Điều này làm tăng tải máy chủ.Có cách nào để PUSH dữ liệu từ máy chủ web đến trình duyệt không?

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

+0

@Rachel - Cập nhật trực tiếp để bạn có thể biết những gì người khác đang làm. Phù hợp 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. –

+0

Bất cứ ai làm điều này loại trong năm 2016 có lẽ sẽ tìm thấy websockets là một sự lựa chọn tốt hơn cho loại thông tin liên lạc. – Shadow

+0

Tôi không chắc chắn có. Để làm cho nó đơn giản hơn về khái niệm cho ứng dụng, tôi đoán bạn có thể thực hiện một tầng vận chuyển trên đầu 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? Chỉnh sửa: Dường như nó được gọi là reverse AjaxComet, nhưng cho đến nay có vẻ như bạn phải tự mình thực hiện. Một thư viện JavaScript cho điều này, bất cứ ai? –

Trả lời

9

Nhìn vào Comet (một giả mạo trên thực tế là Ajax là một tác nhân làm sạch và như vậy là Comet) mà về cơ bản là "đảo ngược Ajax". 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 để mỗi người dùng nhận thông báo, do đó, hãy lưu ý đến các tác động hiệu quả khi viết ứng dụng của bạn.

http://en.wikipedia.org/wiki/Comet_(programming)

0

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

Tôi nghĩ bạn có thể làm những việc thông minh với việc bỏ phiếu khiến nó hoạt động giống như đẩy không gửi nội dung không thay đổi nhưng để kết nối mở nhưng tôi chưa bao giờ làm điều này.

1

Có các 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ờ các công cụ đượ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ủ một cách không thường xuyên, mà không cần bỏ phiếu.

-1

Bạn cũng có thể xem Java Pushlets nếu bạn đang sử dụng các trang jsp.

1

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.

Khám phá Comet article qua tại wikipedia, đó là một nơi tốt để bắt đầu.

Bạn không cung cấp nhiều thông tin nhưng nếu bạn đang xem xét xây dựng một số loại trang web hướng sự kiện (a'la digg spy) hoặc điều gì đó dọc theo dòng bạn có thể sẽ xem xét triển khai ẩn IFRAME 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.

4

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

Đối với một loại "bảng điều khiển trung tâm cuộc gọi" của ứng dụng web liên quan đến cập nhật trạng thái cuộc gọi và người gọi cho người gọi trực tiếp, chúng tôi đã phát triển 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, đợi các sự kiện mới và duy trì ảnh chụp tình huống. Dịch vụ này cung cấp một máy chủ web nhỏ.

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ị ảnh và sau đó quay lại, yêu cầu ảnh mới.Các máy chủ web tại thời điểm này có thể:

  • Trả lại ảnh mới, nếu có một
  • Khối khách hàng đối với một số giây (30 trong thiết lập của chúng tôi) chờ đợi đối với một số sự kiện để ocurr và thay đổi bức ả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 ở trạng thái còn sống và không kết thúc thời gian chờ của máy khách.

Bằng cách này, khi khách hàng thăm dò ý kiến, nó sẽ nhận được phản hồi trong khoảng thời gian từ 0 đến 30 giây. Nếu một sự kiện mới đã được tạo, nó sẽ ngay lập tức), nếu không nó sẽ bị chặn cho đến khi sự kiện mới được tạo ra.

Đó là cơ bản bỏ phiếu, nhưng nó phần nào thông minh bỏ phiếu để không 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ế trước thời đại AJAX, vì vậy có rất nhiều chỗ để cải thiện.

Nếu ai đó có thể cung cấp việc triển khai nhẹ thực tế, tuyệt vời!

4

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

0

Bạn có thể dùng thử Comet Component - mặc dù đó là cực kỳ thử nghiệm ...!

1

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

1

Có thể đáng để khám phá Meteor Server là máy chủ web được thiết kế cho COMET. Đẹp demo và nó cũng được sử dụng bởi twitterfall.

+1

phiên bản mới hơn tại https://www.meteor.com/ và phiên bản này đang được phổ biến rộng rãi. –

35

Có, nó được gọi là Đảo ngược Ajax hoặc Sao chổi. 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 nhằm đẩy dữ liệu trong thời gian thực tới một trình duyệt web. Tôi muốn giới thiệu StreamHub Push Server, họ có một số bản trình diễn thú vị và dễ bắt đầu hơn nhiều so với bất kỳ máy chủ nào khác. Hãy xem Getting Started with Comet and StreamHub Tutorial để 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 bị giới hạn ở 20 người dùng đồng thời. Phiên bản thương mại cũng đáng để hỗ trợ một mình cộng với việc bạn có SSL và Desktop .NET & bộ điều hợp máy khách Java. Trợ giúp có sẵn thông qua các Google Group, có một loạt các hướng dẫn trên mạng và có một GWT Comet adapter quá.

+0

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

+1

Giải thích về những gì Comet sẽ giúp câu trả lời này –

+0

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

5

Sao chổi chắc chắn là những gì bạn muốn. Tùy thuộc vào yêu cầu về ngôn ngữ/khung của bạn, có sẵn các thư viện máy chủ khác nhau. Ví dụ: WebSync is an IIS-integrated comet server for ASP.NET/C#/IIS developers và cũng có một loạt các máy chủ độc lập khác nếu bạn cần tích hợp chặt chẽ hơn với các ngôn ngữ khác.

0

hãy kiểm tra thư viện này https://github.com/SignalR/SignalR biết làm thế nào để đẩy dữ liệu cho khách hàng tự động khi nó trở nên có sẵn

27

Ngày nay, bạn nên sử dụng WebSockets. Đây là tiêu chuẩn năm 2011 cho phép khởi tạo 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 khách-máy chủ hai hướng.

Bạn có thể dễ dàng khởi tạo 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ý sever-side phụ thuộc vào tenchnology ngăn xếp của bạn.

+1

Sự kiện do máy chủ hỗ trợ gửi: http://stackoverflow.com/questions/5195452/websockets-vs-server-sent-events-eventsource –

+7

Tôi hoàn toàn đồng ý ... Sử dụng HTTP cho giao tiếp hai chiều giống như suy nghĩ trong các cuộc gọi REST để làm cho Mario nhảy trên vỏ rùa ... đó là sự điên rồ. Bạn không cần phải thực hiện yêu cầu và chờ phản hồi cho nút đơn giản đẩy mọi người .... Bạn chỉ cần không. HTTP là giao thức tài liệu. Hyper TEXT Transfer Protocol. Ajax Push là một cách cực kỳ phức tạp để phá hoại HTTP để làm những gì WebSocket thực hiện theo thiết kế. Ngừng bị ngốc nghếch và sử dụng đúng công cụ cho công việc. –

4

Cách khác, tiêu chuẩn, cách là SSE (Server-Sent Events, also known as EventSource, sau đối tượng JavaScript).

+0

Phiên bản mới nhất của thông số W3C http://www.w3.org/TR/2009/WD-eventsource-20091029/ chuyển hướng đến https://html.spec.whatwg.org/multipage/comms.html#server- sự kiện đã gửi –