2010-01-15 43 views
8

Tôi phải lập trình các trang web, nhưng tôi không thích tính chất HTML tĩnh. Tôi thích nhiều kiến ​​trúc client-server hơn.Kiến trúc AJAX và Máy khách-Máy chủ với JavaScript

Bây giờ tôi đã tìm ra, với XMLhttp, bạn về cơ bản có thể tự động cập nhật trang của bạn và gửi/yêu cầu thông tin/hành động đến/từ máy chủ. Vì vậy, điều này về cơ bản sẽ bao gồm khu vực khách hàng.

Nhưng để hoàn thành kiến ​​trúc máy khách, máy chủ cũng cần gửi/yêu cầu thông tin, mà không được truy vấn.

Có cách nào, ví dụ cho máy chủ trò chuyện, để gửi lại tin nhắn đã nhận cho tất cả khách hàng (khách hàng sử dụng trình duyệt web) mà không có khách hàng phải truy vấn trong một khoảng thời gian cố định? Tôi muốn thực hiện điều đó mà bạn có thể thấy khi bạn nhập nội dung nào đó.

+0

Bạn đang nói về thao tác "Đẩy" từ máy chủ web, thay vì yêu cầu mã phía máy khách yêu cầu mã mới, phải không? –

+0

Chính xác! Tôi muốn phát hành một lệnh máy chủ kích hoạt một hành động của khách hàng. –

Trả lời

13

Có một số cách khác nhau để thực hiện việc này. Một số người trong số họ đã được trả lời ở đây, nhưng tôi muốn bao gồm một vài chi tiết cũng như suy nghĩ của tôi về họ.

1.Bỏ phiếu

Yêu cầu thường xuyên được gửi đến máy chủ để kiểm tra thông tin mới. Đây là cách tồi tệ nhất để làm điều này, nhưng có lẽ là dễ nhất. Nếu trang web của bạn sẽ có số lượng người dùng thấp, điều đó có thể đáng làm theo cách này.

Điều này có thể được thực hiện bằng cách sử dụng setInterval(myFunction, n) trong javascript để gửi XMLHttpRequests đến máy chủ mỗi n mili giây. Sau đó, trên máy chủ, bạn trả lời thông tin này với thông tin mới của mình, khi bạn có, hoặc một số thông báo ngụ ý không có thông tin mới.

2. dài Polling

Khi trang web được tải, nó làm cho một yêu cầu đến máy chủ để biết mới. Máy chủ giữ kết nối mở cho đến khi có gì đó để gửi lại. Phương pháp này làm giảm lượng lưu lượng mạng được sử dụng, nhưng tăng các tài nguyên được sử dụng trên máy chủ. Bạn có thể sử dụng điều này cho một số ít người dùng, nhưng nó không có quy mô rất tốt.

Cách dễ nhất để thực hiện việc này là để trang xử lý yêu cầu AJAX chỉ cần chờ thông tin mới khả dụng, sau đó trả lời. Điều này có thể kết nối rất nhiều trên máy chủ của bạn. Vì vậy, sử dụng cẩn thận.

3. COMET

COMET về cơ bản là bỏ phiếu dài, nhưng máy chủ được thiết lập đúng cách cho nó. Nó biết rằng các kết nối này không phải là "thực" và nó sử dụng ít tài nguyên hơn để xử lý chúng. Đây là một giải pháp tuyệt vời cho vấn đề này, nhưng nó đòi hỏi rằng máy chủ được thiết lập rõ ràng cho mục đích này. Có các máy chủ COMET và COMET addins cho các máy chủ phổ biến khác, nhưng nó sẽ yêu cầu một số thiết lập và đôi khi một số tiền.

Thực hiện điều này trên .NET không phải là điều đơn giản nhất trên thế giới. Bạn có thể trả tiền cho các giải pháp, cố gắng tìm mã của người khác thực hiện điều gì đó tương tự hoặc tự mình viết mã. Tôi đã không tìm thấy bất kỳ giải pháp miễn phí phong nha cho việc này. Nếu ai đó có, xin vui lòng bình luận.

4. RIA

Một giải pháp khác sẽ được bao gồm Flash, Silverlight, hoặc Java Applet trên trang của bạn. Mọi người thường làm điều này bằng cách sử dụng một đối tượng 1x1 để họ có thể sử dụng Flash hoặc Silverlight để nói chuyện với máy chủ. Nếu bạn không nhớ thêm sự phụ thuộc, đây là một giải pháp tốt. Nếu bạn đã biết Silverlight hoặc Flash, nó có thể tương đối đơn giản để thực hiện.

Bạn có thể tìm thấy các hướng dẫn trên internet cho từng tùy chọn này.

5. Sockets Web

Nếu bạn đang ở trên cắt cạnh, bạn có thể nhìn vào Web Sockets. Nó chỉ có sẵn trong các bản dựng mới nhất của các trình duyệt hiện đại. Nó là một phần của HTML5, nhưng bây giờ nó có thể là thông số riêng của nó. Bất kể, điều đó có nghĩa là các trình duyệt cũ hơn sẽ không thể xử lý nó. Tuy nhiên, nếu bạn không ngại giới hạn bản thân với trình duyệt mới nhất, bạn có thể sử dụng tính năng tuyệt vời này.

Tôi tin rằng Chromium là trình duyệt duy nhất hiện hỗ trợ nó. Tuy nhiên, có công việc đang được thực hiện để thực hiện điều này trong Firefox và WebKit.

Tôi sẽ dành cho bạn những tranh cãi và chỉ đơn giản nói rằng điều này thực hiện chính xác những gì bạn muốn. Tóm tắt của spec nói tất cả.

Đặc tả này xác định API cho phép các trang Web sử dụng giao thức Web Sockets để liên lạc hai chiều với máy chủ từ xa.

Nợ cần chú ý

Nếu bạn quan tâm trong thế giới của Node JS, bạn không thể đi sai với Socket IO. Nó sẽ thực hiện tốt nhất của bất kỳ công nghệ có sẵn cho trình duyệt.

Kết luận

Lựa chọn tốt nhất là Socket.IO trên Node JS. Tuy nhiên, đối với một giải pháp ASP.Net, đi cho COMET hoặc Web Sockets, nếu bạn có thể. Nếu không, sử dụng Flash/Silverlight không phải là khủng khiếp. Cuối cùng, bỏ phiếu và bỏ phiếu dài nên là những khu nghỉ dưỡng cuối cùng. Bạn luôn có thể hỗ trợ một trong số này, sau đó rơi trở lại khác nếu không có hỗ trợ cho nó trong trình duyệt của khách hàng.

+1

Sau khi xem xét cẩn thận, tôi đã chọn WebSockets + WebSockets-FlashBridge, cho không phải Chromium. Sự kết hợp này hoạt động tốt cho tất cả các trình duyệt, bao gồm cả iPhone + iPad. –

1

Máy khách phải thông báo cho máy chủ khi người dùng máy khách bắt đầu nhập. Bạn có một vài lựa chọn ở đây.

  1. Yêu cầu thường xuyên từ máy chủ cho hoạt động mới nhất. Điều này sẽ diễn ra cho mỗi người dùng tham gia trò chuyện. Yêu cầu tương tự cũng có thể được sử dụng để gửi hoạt động cụ thể cho người dùng đến máy chủ: "Jonathan đang nhập ..."

  2. Bỏ phiếu dài. Điều này về cơ bản yêu cầu thông tin từ máy chủ và máy chủ giữ kết nối được mở cho đến khi nó có thứ gì đó để gửi lại. Vì vậy, yêu cầu của bạn được giảm thiểu, nhưng kết nối của bạn vẫn mở lâu hơn.

Tùy thuộc vào lưu lượng truy cập, loại dữ liệu được truyền, môi trường máy chủ và nhiều yếu tố khác, một trong các tùy chọn này có thể tỏa sáng hơn các yếu tố khác.

0

Dựa trên kiến ​​trúc REST hệ thống html dựa trên, vai trò của máy chủ chỉ đơn giản là hoạt động như một tài nguyên để khách hàng kéo. Tôi đang khái quát hóa nhưng có những công cụ để thực hiện loại hành động này ở phía máy khách, chứ không phải ở phía máy chủ.

Bạn nên viết/sử dụng thư viện có thể yêu cầu cập nhật từ máy chủ định kỳ. Bạn có thể đóng gói các loại yêu cầu này trong một đối tượng javascript có thể kích hoạt các sự kiện. Bằng cách này, kịch bản lệnh phía máy khách của bạn có thể hoạt động giống như nó được thông báo từ máy chủ. Xem lại một số nội dung phổ biến với COMET bạn có thể tìm thấy một số công cụ để giúp bạn mã phía máy khách.

HTML 5 có một số nỗ lực dự kiến ​​ở loại chức năng này, nhưng nếu bạn muốn ứng dụng của mình hoạt động trên các trình duyệt cũ hơn, tốt hơn bạn nên sử dụng các phương pháp ổn định hơn, như cập nhật yêu cầu AJAX.

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