2008-12-03 20 views
19

Tôi đang tìm cách thiết lập một số loại chức năng loại socket/COMET từ (các) máy chủ đến ứng dụng iPhone của tôi. Về cơ bản, bất cứ lúc nào người dùng quản lý để thiết lập một đối tượng tùy ý 'bẩn' trên máy chủ, bằng cách nói, cập nhật Địa chỉ của họ .. thông tin phản hồi nên được đẩy từ máy chủ đến bất kỳ khách hàng nào giữ cuộc thăm dò trực tiếp đến máy chủ. Các từ thông dụng cho điều này là COMET tôi giả sử. Tôi biết có DWR ở đó cho các ứng dụng trình duyệt web, vì vậy tôi nghĩ, có lẽ tốt nhất là đặt UIWebView ẩn trong mỗi bộ điều khiển của tôi để tôi có thể thoát khỏi hộp COMET từ khung javascript của họ? Có cách tiếp cận trang nhã hơn không?COMET (máy chủ đẩy tới máy khách) trên iPhone

Trả lời

10

Có một vài giải pháp có sẵn để sử dụng ứng dụng khách STOMP.

STOMP cực kỳ đơn giản và nhẹ, hoàn hảo cho iPhone.

Tôi đã sử dụng this one làm điểm xuất phát của mình và thấy nó rất tốt. Nó có một vài vấn đề phân bổ đối tượng/rò rỉ bộ nhớ, nhưng một khi tôi nhận được hang của lập trình iPhone, đây là dễ dàng để sắt ra.

Hy vọng điều đó sẽ hữu ích!

2

Tôi đã viết web server để thực hiện chính xác loại điều này. Tôi đang đẩy cập nhật thời gian thực thông qua máy chủ có phiếu thăm dò ý kiến ​​dài và, như một ví dụ, tôi đã hiển thị dữ liệu đó là safari on the iPhone.

Một trường hợp nhất định của máy chủ sẽ có thể xử lý một vài nghìn ứng dụng khách đồng thời mà không cần cố gắng quá nhiều. Tôi đã có một kế hoạch để đặt chúng trong một hệ thống phân cấp để cho phép mở rộng quy mô lớn hơn (nên khá tầm thường, nhưng không ảnh hưởng đến ứng dụng hiện tại của tôi).

1

Có thể bỏ phiếu dài hạn cho những gì bạn muốn đạt được không? Bạn có thể triển khai phía máy khách trong một vài dòng Javascript thông thường, sẽ nhẹ hơn bất kỳ khung công tác nào có thể có.

Nó cũng sẽ là tầm thường để thực hiện nó trong ObjC (kết nối, chờ đợi một phản ứng hoặc thời gian chờ, lặp lại)

Câu trả lời cho câu hỏi của tôi Simple "Long Polling" example code? hy vọng giải thích cách cực kỳ đơn giản Polling Long là ..

Về cơ bản bạn sẽ chỉ yêu cầu một URL như thường lệ - máy chủ web sẽ chấp nhận kết nối, nhưng không gửi bất kỳ dữ liệu nào cho đến khi nó có sẵn. Khi bạn nhận dữ liệu hoặc kết nối hết giờ, bạn kết nối lại (và lặp lại)

Bit phức tạp nhất sẽ là phía máy chủ, vì bạn không thể sử dụng máy chủ web thường xuyên như Apache, mặc dù điều này cũng trường hợp với Comet ..

0

Bạn có muốn/thực hiện giao tiếp cho ứng dụng của mình qua http không? Nếu không, bạn có thể sử dụng khung CFNetwork để sử dụng ổ cắm (TCP/UDP) để cho phép ứng dụng và máy chủ của bạn giao tiếp. Từ những gì tôi đã thấy trong ngăn xếp CFNetwork, nó khá tuyệt, và làm cho nó khá hẹp để đọc và ghi vào các luồng, và cho phép truyền thông đồng bộ và không đồng bộ. Nó cũng cho phép bạn định nghĩa các callback trên socket của bạn cho phép bạn nhận thông báo về các sự kiện như dữ liệu nhận được, kết nối được thực hiện, v.v. Vì vậy, trong ví dụ của bạn, bạn có thể gửi thông tin qua socket đến máy chủ của bạn, và sau đó bạn có thể định nghĩa gọi lại để nghe dữ liệu đến trên luồng và sau đó cập nhật ứng dụng của bạn cho phù hợp.

EDIT: Đã nghiên cứu thêm một chút và nếu bạn sử dụng phương pháp tiếp cận socket, bạn cũng có thể xem các lớp NSStream. Chúng là những trừu tượng Cocoa được xây dựng trên đầu trang của các công cụ CFSocket.

+1

Sử dụng ổ cắm thô sẽ dễ dàng hơn (và chắc chắn sẽ hoạt động tốt hơn), nhưng sẽ không được hỗ trợ trên một số mạng di động. Hãy chắc chắn cung cấp một Comet hoặc dự phòng cuộc thăm dò HTTP tiêu chuẩn – rpetrich

+0

cuộc gọi tốt về hỗ trợ nhà cung cấp dịch vụ, không bao giờ nghĩ về điều đó ban đầu ... – nstehr

3

Bạn có thể sử dụng ổ cắm TCP/IP thông thường trong ứng dụng của mình không?

A) Nếu có thì chắc chắn một ổ cắm TCP/IP thô là giải pháp thanh lịch hơn. Từ ứng dụng iPhone của bạn, bạn chỉ cần đợi các sự kiện thông báo. Ổ cắm được mở miễn là ứng dụng của bạn đang mở. Nếu bạn muốn, bạn thậm chí có thể sử dụng giao thức HTTP/tiêu đề.

Ở phía máy chủ, bạn có thể sử dụng một số khung công tác để viết các máy chủ xử lý hiệu quả hàng nghìn kết nối TCP/IP mở. ví dụ: Twisted, EventMachine hoặc libevent. Sau đó, chỉ cần kết nối socket chính của máy chủ với cổng http (80).

Ý tưởng là sử dụng máy chủ chỉ giữ một cấu trúc dữ liệu cho mỗi khách hàng. Nhận sự kiện cập nhật từ một số ứng dụng DB và sau đó đẩy nó đến đúng máy khách.

B) Không, bạn phải sử dụng Apache và ứng dụng khách http trên iPhone. Sau đó, bạn nên biết rằng toàn bộ giải pháp COMET trong thực tế hoạt động xung quanh các hạn chế của giao thức HTTP và Apache/PHP.

Apache được thiết kế để xử lý nhiều kết nối thời gian ngắn. Theo tôi biết chỉ có phiên bản mới nhất Apache (mpm công nhân) có thể xử lý hiệu quả số lượng lớn các kết nối mở. Trước đây Apache đã giữ một quy trình cho mỗi kết nối.

Trình duyệt web có giới hạn kết nối mở đồng thời với một máy chủ web (thực tế là địa chỉ URL, ví dụ: www.foo.com, không phải địa chỉ IP của www.foo.com). Và giới hạn là 2 kết nối. Ngoài ra, một trình duyệt sẽ chỉ cho phép kết nối AJAX đến cùng một máy chủ mà từ đó trang HTML chính đã được tải xuống.

0

bạn không đề cập đến công nghệ mà bạn đang sử dụng. Nhưng trong trường hợp nó là microsoft .net (hoặc cho bất kỳ googlers khác người đi qua này), có một lựa chọn đơn giản cho sao chổi: http://www.codeplex.com/ncomet.

-1

COMET, LightStreamer, AJAX tất cả những thứ rác đó bị hỏng. Đó là vấn đề cơ bản của TCP mà không có 'keep-alives' được đảm bảo mà không có ping giao thông .. Vì vậy, bạn có thể quên rằng bỏ phiếu dài nếu bất kỳ độ tin cậy hoặc giao hàng kịp thời là để được đảm bảo ..

Nó chỉ hype mọi người đã thấy thông qua vào năm 2003 khi người què-hưng khởi ..

+0

Nếu cần thiết, bạn luôn có thể gửi nhịp tim như một phần của phản hồi. Đối với một phản ứng javascript bạn có thể gửi void(); thường xuyên cho đến khi bạn có dữ liệu thực để gửi. Comet là một giải pháp tốt trong các tình huống mà HTTP là bắt buộc (ví dụ: ứng dụng web, mạng di động nước ngoài chỉ có HTTP, v.v.) – rpetrich

+0

Điểm không còn là cuộc thăm dò dài hạn, cộng với bạn cần kết nối TCP khác, cộng với duy trì trên máy chủ ... –

+0

Vì vậy, JavaScript phải gửi và tiếp tục gửi. Làm cho nó bất cứ điều gì dài hơn 10 giây và bạn biết kinh nghiệm giao diện người dùng sẽ hút. Bây giờ bắt đầu mở rộng quy mô đó. Và ngay cả với các kết nối liên tục, khi nó xấu đi nó thực sự trở nên tồi tệ như tất cả các hack trên hacks .. –

2

WebSync có một khách hàng javascript hoạt động trên iPhone, nếu đó là những gì bạn đang sau

1

StreamHub Comet Server công trình với iPhone ra khỏi hộp, không có plugin hoặc bất cứ thứ gì cần thiết. Chỉ cần duyệt đến trang web của họ trên iPhone của tôi và tất cả các ví dụ đã làm việc, không cần phải cài đặt Flash hoặc bất cứ thứ gì.