COMET (server push to client) na iPhone [zamknięty]

Szukam jakiejś funkcjonalności typu socket / COMET z mojego serwera(ów) do mojej aplikacji na iPhone ' a. Zasadniczo, za każdym razem, gdy użytkownik zdoła ustawić dowolny obiekt "brudny" na serwerze, np. aktualizując swój adres.. informacje zwrotne powinny być przesyłane z serwera do wszystkich klientów, którzy prowadzą ankietę na żywo na serwerze. Hasło do tego to chyba Kometa. Wiem, że istnieje DWR dla aplikacji przeglądarek internetowych, więc myślę, że może najlepiej ustawić Ukryty UIWebView w każdym z moich kontrolerów tylko po to, żebym mógł wyjść z pudełka z ich javascript framework? Czy istnieje bardziej eleganckie podejście?

Author: Chris Hanson, 2008-12-03

9 answers

Dostępnych jest kilka rozwiązań do wykorzystania klienta STOMP.

STOMP jest niesamowicie prosty i lekki, idealny dla iPhone ' a.

Użyłem ten jako punkt wyjścia i uznałem go za bardzo dobry. Ma kilka problemów z alokacją obiektów/wyciekiem pamięci, ale kiedy już opanowałem programowanie iPhone ' a, łatwo je było wyprasować.

Mam nadzieję, że to pomoże!

 10
Author: adam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-03 18:20:06

Czy możesz używać zwykłego gniazda TCP / IP w swojej aplikacji?

A) jeśli tak, to zdecydowanie surowe Gniazdo TCP / IP jest bardziej eleganckim rozwiązaniem. Z aplikacji na iPhone ' a po prostu czekasz na zdarzenia powiadomień. Gniazdo jest otwarte tak długo, jak długo aplikacja jest otwarta. Jeśli chcesz, możesz nawet użyć protokołu HTTP / nagłówków.

Po stronie serwera można użyć jakiegoś frameworka do pisania serwerów, które efektywnie obsługują tysiące otwartych połączeń TCP / IP. e. G Twisted, EventMachine lub libevent . Następnie wystarczy podłączyć gniazdo główne serwera do portu http (80).

Chodzi o to, aby użyć serwera, który przechowuje tylko jedną strukturę danych na klienta. Odbiera Zdarzenie update z jakiejś aplikacji DB, a następnie wypycha je do właściwego klienta.

B) nie, musisz użyć Apache i klienta http po stronie iPhone ' a. wtedy powinieneś wiedzieć, że całe rozwiązanie COMET jest w rzeczywistości obejściem ograniczeń protokołu HTTP i Apache / PHP.

Apache został zaprojektowany do obsługa wielu połączeń w krótkim czasie. O ile wiem, tylko najnowsze wersje Apache (mpm worker) potrafią efektywnie obsłużyć dużą liczbę otwartych połączeń. Wcześniej Apache przechowywał jeden proces na każde połączenie.

Przeglądarki internetowe mają limit jednoczesnych otwartych połączeń z jednym serwerem WWW (w rzeczywistości adres URL, np. www.foo.com, nie adres IP www.foo.com). a limit to 2 połączenia. Dodatkowo przeglądarka pozwoli tylko na połączenia AJAX z tym samym serwerem, z którego główny HTML strona została pobrana.

 3
Author: Greg Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-13 10:44:45

Napisałem serwer WWW do robienia dokładnie tego typu rzeczy. Przepycham aktualizacje w czasie rzeczywistym przez serwer z długim sondowaniem i jako przykład miałem safari na iPhonie wyświetlające te dane.

Dana instancja serwera powinna być w stanie obsłużyć kilka tysięcy jednoczesnych klientów bez zbytniego wysiłku. Mam plan, aby umieścić je w hierarchii, aby umożliwić bardziej poziome skalowanie (powinno być dość trywialne, ale nie wpływa na mój obecny aplikacji).

 2
Author: Dustin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-03 18:30:51

WebSync ma klienta javascript, który działa na iPhonie, jeśli o to ci chodzi

 2
Author: jvenema,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-20 16:11:58

Czy long-ankietowanie zadziała na to, co chcesz osiągnąć? Możesz zaimplementować stronę Klienta w kilku liniach zwykłego Javascript, który będzie lżejszy niż jakikolwiek framework.

Byłoby również trywialne zaimplementowanie go w ObjC (connect, wait for a response or timeout, repeat)

Odpowiedzi na moje pytanie prosty przykładowy kod "długiego sondażu"? miejmy nadzieję, że wyjaśnisz, jak bardzo proste jest długie sondowanie..

W zasadzie wystarczy poprosić o adres URL jako Zwykle-serwer WWW zaakceptuje połączenie, ale nie wyśle żadnych danych, dopóki nie będzie dostępne. Po odebraniu danych lub przekroczeniu czasu połączenia, łączysz się ponownie (i powtarzasz)

Najbardziej skomplikowanym bitem byłby serwer po stronie serwera, ponieważ nie można używać zwykłego, gwintowanego serwera www, takiego jak Apache, chociaż tak jest również w przypadku Comet..

 1
Author: dbr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:45:46

StreamHub Comet Server działa z iPhone ' em po wyjęciu z pudełka, bez żadnych wtyczek ani niczego wymaganego. Po prostu przeglądałem ich stronę na moim iPhonie i wszystkie przykłady działały, nie trzeba było instalować Flasha ani nic.

 1
Author: Jeff Atwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-29 07:31:18

Czy chcesz / masz zrobić komunikację dla aplikacji przez http? Jeśli nie, możesz użyć frameworku CFNetwork, aby używać gniazd (TCP / UDP), aby umożliwić komunikację aplikacji i serwera. Z tego, co widziałem na stosie CFNetwork, jest całkiem fajny i sprawia, że odczyt i zapis do strumieni jest dość prosty, a także pozwala na synchroniczną i asynchroniczną komunikację. Pozwala również na zdefiniowanie wywołań zwrotnych na gnieździe, co pozwala otrzymywać powiadomienia o zdarzeniach, takich jak odebrane dane, połączenie wykonane itp. Tak więc, w twoim przykładzie można wysłać informacje przez gniazdo do serwera, a następnie można zdefiniować callback, który będzie nasłuchiwać przychodzących danych w strumieniu, a następnie odpowiednio zaktualizować aplikację.

EDIT: zrobiłem trochę więcej badań, a jeśli pójdziesz podejście socket, może chcesz również spojrzeć na klasy NSStream. Są abstrakcjami kakaowymi zbudowanymi na materiale CFSocket.

 0
Author: nstehr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-11 01:49:37

Nie wspomniałeś, jakiej technologii używasz. Ale w przypadku, gdy jest to microsoft. NET (lub dla innych googlerów, którzy się z tym zetkną), jest prosta opcja dla comet: http://www.codeplex.com/ncomet .

 0
Author: Joel Martinez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-16 13:24:06

COMET, LightStreamer, AJAX wszystkie te śmieci są zepsute. To podstawy TCP, że żadne "utrzymanie" nie są nigdy gwarantowane bez pingowania ruchu.. Możesz więc zapomnieć o tym długim sondażu, jeśli ma być zagwarantowana przyzwoita niezawodność lub terminowa dostawa..

To tylko szum, który wszyscy widzieli w 2003 roku, kiedy zaczęła się lamerska mania..

 -1
Author: rama-jka toti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-16 23:15:52