COMET (сервер push to client) на iPhone [закрыто]
Я ищу, чтобы установить какую-то функциональность типа сокета/кометы с моего сервера(ов) на мое приложение iPhone. По сути, каждый раз, когда пользователю удается установить произвольный объект "грязный" на сервере, скажем, обновив свой адрес.. обратная связь должна быть передана с сервера любым клиентам, поддерживающим живой опрос на сервере. Модное слово для этого-комета, я полагаю. Я знаю, что есть DWR для приложений веб-браузера, поэтому я думаю, может быть, лучше установить скрытый UIWebView в каждом из моих контроллеров, чтобы я мог выйти из коробки COMET из их JavaScript-фреймворка? Есть ли более элегантный подход?
9 ответов
есть несколько решений, доступных для использования топайте клиент.
STOMP невероятно прост и легкий, идеально подходит для iPhone.
Я этот в качестве отправной точки, и нашел его очень хорошим. У него есть несколько проблем с распределением объектов / утечкой памяти, но как только я получил навык программирования iPhone, их было легко сгладить.
надеюсь, что это поможет!
можете ли вы использовать обычный сокет TCP/IP в своем приложении?
A) если да, то определенно необработанный сокет TCP/IP является более элегантным решением. Из вашего приложения iPhone вы просто ждете событий уведомлений. Сокет открыт до тех пор, пока приложение открыто. Если вы хотите, вы даже можете использовать HTTP-протокол / заголовки.
на стороне сервера вы можете использовать некоторые рамки для записи серверов, которые эффективно обрабатывают тысячи открытых TCP / IP-соединений. е.г Twisted, EventMachine или libevent. Затем просто свяжите основной сокет сервера с портом http (80).
идея состоит в том, чтобы использовать сервер, который сохраняет только одну структуру данных на клиента. Получает событие обновления из некоторого приложения БД, а затем передает его правому клиенту.
B) нет, вы должны использовать Apache и http-клиент на стороне iPhone. тогда вы должны знать, что все решение COMET на самом деле работает для ограничений протокола HTTP и Apache / PHP.
Apache был разработан для обработки многих коротких временных соединений. Насколько я знаю, только новейшие версии Apache (mpm worker) могут эффективно обрабатывать большое количество открытых соединений. Ранее Apache сохранял один процесс на соединение.
веб-браузеры имеют ограничение одновременных открытых подключений к одному веб-серверу(URL-адрес, например. www.foo.com, не IP-адрес www.foo.com). И предел 2 соединения. Кроме того, браузер будет разрешить только подключения AJAX к тому же серверу, с которого была загружена основная HTML-страница.
Я написал веб-сервер для того, чтобы делать именно такие вещи. Я толкаю обновления в реальном времени через сервер с длинным опросом, и, например, у меня было сафари на iPhone отображения этих данных.
данный экземпляр сервера должен иметь возможность обрабатывать несколько тысяч параллельных клиентов без особых усилий. У меня есть план поместить их в иерархию, чтобы обеспечить более горизонтальное масштабирование (должно быть довольно тривиальным, но не влияет на мой текущее приложение.)
Websyncбыл имеет клиент javascript, который работает на iPhone, если это то, что вам нужно
будет ли длинный опрос работать для того, чего вы хотите достичь? Вы можете реализовать клиентскую сторону в нескольких строках обычного Javascript, который будет легче, чем любая платформа.
было бы также тривиально реализовать его в ObjC (подключиться, дождаться ответа или тайм-аута, повторить)
ответы на мой вопрос простой пример кода "длинный опрос"? надеюсь объяснить, как чрезвычайно простой длинный опрос..
в основном вы просто запросите URL - адрес, как обычно-веб-сервер примет соединение, но не отправит никаких данных, пока он не будет доступен. Когда вы получаете данные или время ожидания соединения, вы повторно подключаетесь (и повторяете)
самым сложным битом будет сервер на стороне сервера, так как вы не можете использовать обычный веб-сервер с потоком, такой как Apache, хотя это также относится к Comet..
StreamHub Comet-Сервер работает с iPhone из коробки, никаких плагинов или ничего не требуется. Просто просмотрел их сайт на моем iPhone, и все примеры работали, не нужно было устанавливать Flash или что-то еще.
вы хотите / есть ли связь для вашего приложения по http? Если нет, вы можете использовать CFNetwork framework для использования сокетов (TCP/UDP), чтобы позволить вашему приложению и серверу общаться. Из того, что я видел в стеке CFNetwork, это довольно круто и делает его довольно прямым для чтения и записи в потоки, а также позволяет синхронную и асинхронную связь. Он также позволяет вам определять обратные вызовы в сокете, позволяя получать уведомления о таких событиях, как полученные данные, соединение и т. д. Таким образом, в вашем примере вы можете отправить информацию через сокет на свой сервер, а затем определить обратный вызов, который будет прослушивать входящие данные в потоке, а затем соответствующим образом обновить приложение.
EDIT: сделал немного больше исследований, и если вы идете подход сокета, вы можете также посмотреть на классы NSStream. Это абстракции какао, построенные поверх материала CFSocket.
вы не упомянули, какую технологию serverside вы используете. Но в случае, если это Microsoft .net (или для любых других гуглеров, которые сталкиваются с этим), есть простой вариант для comet:http://www.codeplex.com/ncomet.
комета, LightStreamer, AJAX весь этот мусор сломан. Это основы TCP, что никакие "keep-alives" никогда не гарантируются без пинг-трафика.. Таким образом, вы можете забыть, что длительный опрос, если какая-либо достойная надежность или своевременная доставка должна быть гарантирована..
Это просто шумиха, которую все видели в 2003 году, когда началась Хромая мания..