2012-05-06 54 views
5

Tôi sẽ phát triển một khuôn khổ cho lập trình sao chổi, và tôi không thể sử dụng Web Sockets, hoặc Server-Sent Events (vì hỗ trợ trình duyệt thực sự rất tệ). Vì vậy, tôi cần phải giữ cho kết nối HTTP còn sống, và gửi dữ liệu chunked trở lại cho khách hàng.Phép thuật đằng sau Lightstreamer là gì?

Tuy nhiên, vấn đề hiện mình là bạn nhận được vào công việc:

  1. Sử dụng XMLHttpRequest là không thể, do thực tế rằng IE sẽ không cung cấp cho bạn xhr.responseText trong khi xhr.readyState là 3.
  2. Một hidden iframe không thể hữu ích, bởi vì trình duyệt hiển thị trình tải trong khi tôi gửi dữ liệu lại cho khách hàng.
  3. Tôi đã thử gửi lại tệp JavaScript cho máy khách, gửi các lệnh thực thi hàm mỗi lần, nhưng các trình duyệt sẽ không thực thi JavaScript cho đến khi nó được tải hoàn toàn.

Tuy nhiên, khi tôi xem Lightstreamer demo page, tôi thấy rằng nó gửi tệp JavaScript trở lại từng khách hàng và mỗi bước gửi một hàm đến hàm và chức năng đó được thực thi (tôi có thể 't làm phần này). Có vẻ như Lightstreamer sử dụng AJAX, vì yêu cầu đơn giản xuất hiện trong tab giao diện điều khiển của Firebug, nhưng nó hoạt động giống như một sự quyến rũ trong IE.

Tôi đã cố gắng sử dụng mọi trường tiêu đề HTTP mà họ đã đặt trên yêu cầu của họ và không có kết quả nào. Tôi cũng đã cố gắng sử dụng HTTP Post thay vì HTTP Get, nhưng vẫn không có kết quả.

Tôi đã đọc gần như hơn 20 bài báo về cách thực hiện sao chổi, nhưng không ai of'em xuất hiện để giải quyết những vấn đề tôi có:

  1. Làm thế nào để làm cho nó qua trình duyệt?
  2. Cách nhận thông báo khi dữ liệu mới đến từ máy chủ (tôi nên móc vào sự kiện nào)?
  3. Làm cách nào để trang của tôi xuất hiện như được tải hoàn toàn cho người dùng (cách triển khai trang đó để trình duyệt không hiển thị hoạt động tải)?

Mọi người có thể giúp bạn không? Tôi nghĩ rằng có một mẹo nhỏ hoặc mẹo nhỏ mà tôi không biết ở đây để dán tất cả các khái niệm lại với nhau. Có ai biết những gì lightstreamer làm để vượt qua những vấn đề này?

Trả lời

3

nhưng các trình duyệt sẽ không thực thi JavaScript cho đến khi hoàn toàn được tải.

Bạn đã thử gửi lại mã được bao trong <script> thẻ? Ví dụ, thay vì:

<script type="text/javascript"> 
f(...data1...); 
f(...data2...); 

thử

<script type="text/javascript">f(...data1...);</script> 
<script type="text/javascript">f(...data2...);</script> 
+0

Vâng, tôi đã thử nó, nhưng nó chỉ hoạt động nếu bạn đặt loại MIME thành * text/html *. Nói cách khác, bạn nên yêu cầu một tài liệu HTML khác. Nếu bạn đặt phản hồi thành ** application/javascript ** hoặc ** application/x-javascript ** hoặc ** text/javascript ** nó sẽ không hoạt động. Ngoài ra nó không giải quyết được vấn đề của tôi. Tôi có thể sử dụng XMLHttpRequest để yêu cầu một tệp HTML chứa các đoạn mã JavaScript. Tuy nhiên, nó không hoạt động trong IE. Tôi có thể sử dụng 'iframe', nhưng nó cho thấy bộ nạp. Lightstreamer hoạt động ở khắp mọi nơi và không hiển thị dấu hiệu của trình tải. –

+0

Cũng xin lưu ý rằng nếu tôi sử dụng 'XMLHttpRequest' để tải tệp HTML bao giờ có chứa thông báo ' 'Đoạn mã JavaScript, chúng sẽ không được thực thi. Ý tôi là, trình duyệt thực hiện mã JavaScript bên trong các thẻ JavaScript khi chúng đến, nhưng chỉ trong các yêu cầu bình thường, không phải yêu cầu ajax. –

1

Các lựa chọn tốt nhất trong trường hợp của bạn sẽ được sử dụng JSONP + Dài kéo về phía máy chủ. Bạn chỉ cần nhớ để kết nối lại bất kỳ thời gian kết nối giảm (lần ra) hoặc bạn nhận được phản ứng.

Ví dụ mã trong jquery:

function myJSONP(){ 
    $.getScript(url, { 
     success: function(){ 
      myJSONP(); //re-connect 
     }, 
     failure: function(){ 
      myJSONP(); //re-connect 
     } 
    }) 
} 

Rõ ràng câu trả lời của bạn từ máy chủ có được mã javascript sẽ kêu gọi các chức năng toàn cầu của bạn.

Hoặc bạn có thể sử dụng một số plugin JSONJ jquery.

Hoặc hãy nhìn vào dự án này http://www.meteor.com/ (thực sự mát mẻ, nhưng không thử nó)

+0

Tôi không muốn thực hiện ** một kết nối (yêu cầu) cho mỗi lần cập nhật **. Tôi chỉ cần mở một kết nối và cập nhật trình duyệt của khách hàng thông qua kết nối duy nhất đó. Xem liên kết trong câu hỏi của tôi và kiểm tra nó trong Firebug. –

4

Các phương pháp bạn muốn là streaming.

Làm cách nào để làm cho trình duyệt chéo?

Xem xét hầu hết các trình duyệt, không có cách nhất quán. Bạn phải chọn phương tiện giao thông phù hợp theo trình duyệt. Thậm chí tệ hơn, bạn phải dựa vào trình duyệt để đánh hơi xem trình duyệt nào đang được sử dụng và tính năng phát hiện tính không có gì về điều này. Bạn có thể sử dụng XDomainRequest cho IE8 +, XMLHttpRequest cho không phải IE và Iframe cho IE 6+. Tránh vận chuyển iframe nếu có thể.

Cách nhận thông báo khi dữ liệu mới đến từ máy chủ (sự kiện nào tôi nên truy cập)?

Điều này thay đổi theo vận chuyển đang được sử dụng. Ví dụ, XDomainRequest kích hoạt sự kiện tiến bộ, XMLHttpRequest kích hoạt sự kiện readystatechange khi đoạn được gửi đến ngoại trừ Opera và IE.

Làm cách nào để trang của tôi xuất hiện hoàn toàn được tải cho người dùng (cách triển khai trang đó để trình duyệt không hiển thị hoạt động tải)?

Tôi không biết vấn đề này với iframe, nhưng vẫn xảy ra trong các trình duyệt dựa trên WebKit như Chrome và Safari với XMLHttpRequest. Cách duy nhất để tránh điều này là kết nối sau khi sự kiện onload của cửa sổ, nhưng, trong trường hợp của Safari, điều này không hoạt động.

Có một số vấn đề bạn phải xem xét bên cạnh các câu hỏi trên.

  1. Máy chủ hướng sự kiện - Máy chủ sẽ có thể xử lý không đồng bộ.
  2. Yêu cầu về vận chuyển - Máy chủ hoạt động khác nhau đối với việc vận chuyển bắt buộc.
  3. Định dạng luồng - Nếu máy chủ gửi thư lớn hoặc nhiều thư trong một đoạn, một đoạn không có nghĩa là một dữ liệu duy nhất. Nó có thể là một đoạn của một dữ liệu hoặc ghép nối nhiều dữ liệu. Để nhận biết dữ liệu là gì, phản hồi phải được định dạng.
  4. Xử lý lỗi - Giao thông nội tuyến không cung cấp bất kỳ bằng chứng nào cho việc ngắt kết nối.
  5. ...

Cuối cùng nhưng không kém phần quan, để thực hiện trực tuyến là khá mệt mỏi hơn nó trông không giống với bỏ phiếu dài. Tôi khuyên bạn nên sử dụng khung vững chắc để thực hiện điều đó như socketio, sockjsjquery socket mà tôi đã tạo và quản lý.

Chúc may mắn.

5

Tác giả SockJS tại đây.

  • Làm cách nào để làm cho trình duyệt chéo?

Thật khó, dự kiến ​​sẽ dành một vài tháng để nhận truyền tải trực tuyến trên opera và IE.

  • Làm cách nào để nhận thông báo khi dữ liệu mới đến từ máy chủ (tôi nên móc vào sự kiện nào)?

Có nhiều kỹ thuật khác nhau, tùy thuộc vào trình duyệt cụ thể. Để có một giới thiệu tốt, hãy xem các giao thức dự phòng khác nhau được hỗ trợ bởi Socket.IO và SockJS.

  • Làm thế nào để làm cho trang web của tôi xuất hiện như là hoàn toàn nạp cho người sử dụng (làm thế nào để thực hiện nó, vì vậy trình duyệt không hiển thị hoạt động tải)?

Một lần nữa, có các thủ thuật dành riêng cho trình duyệt. Một là trì hoãn việc tải AJAX sau khi sự kiện onload. Khác là ràng buộc và hủy liên kết iframe từ DOM. ETC. Nếu bạn vẫn cảm thấy hứng thú, hãy đọc mã SockJS hoặc Socket.io.

Mọi người có thể giúp bạn không? Tôi nghĩ rằng có một mẹo nhỏ hoặc mẹo nhỏ mà tôi không biết ở đây để dán tất cả các khái niệm lại với nhau. Có ai biết những gì lightstreamer làm để vượt qua những vấn đề này?

Về cơ bản, trừ khi bạn có lý do rất mạnh, đừng phát minh lại bánh xe. Sử dụng SockJS, Socket.io, faye hoặc bất kỳ dự án nào khác trong số hàng chục dự án đã giải quyết vấn đề này.

+0

Marek, câu hỏi là "ma thuật trong lightstreamer" là gì - bạn có nói rằng SockJS hay đó là ma thuật? (ví dụ: chúng tôi không cần lightstreamer vì SockJS xử lý máy khách JS nền tảng chéo)? Điều gì về máy chủ lightstreamer, nó làm phép thuật? – Jonesome

+0

Tôi hỏi vì câu hỏi này: http://stackoverflow.com/questions/19667644/level-of-difficulty-to-recreate-lightstreamer-server-and-three-client-pieces – Jonesome

Các vấn đề liên quan