在iPhone上COMET(服务器推送到客户端)

时间:2008-12-03 17:24:52

标签: iphone objective-c cocoa-touch http comet

我正在寻求从我的服务器到我的iPhone应用程序建立某种套接字/ COMET类型功能。基本上,每当用户设法在服务器上设置任意对象'脏'时,例如,更新他们的地址......反馈应该从服务器推送到任何保持对服务器进行实时轮询的客户端。我想这是一个流行词,就是COMET。我知道网页浏览器应用程序有DWR,所以我想,也许最好在我的每个控制器中设置一个隐藏的UIWebView,这样我就可以从他们的javascript框架中开箱即用COMET了?有更优雅的方法吗?

9 个答案:

答案 0 :(得分:10)

有几种解决方案可供STOMP客户端使用。

STOMP非常简单轻巧,非常适合iPhone。

我用this one作为我的起点,发现它非常好。它有一些对象分配/内存泄漏问题,但是一旦我掌握了iPhone编程,就很容易解决这些问题。

希望有所帮助!

答案 1 :(得分:3)

您可以在应用程序中使用普通的TCP / IP套接字吗?

A)如果是,那么绝对原始的TCP / IP套接字是更优雅的解决方案。从您的iPhone应用程序,您只需等待通知事件。只要您的应用程序处于打开状态,套接字就会打开。如果您愿意,您甚至可以使用HTTP协议/标头。

在服务器端,您可以使用一些框架来编写有效处理数千个开放TCP / IP连接的服务器。例如TwistedEventMachinelibevent。然后将服务器主套接字绑定到http端口(80)。

这个想法是使用一个服务器,每个客户端只保留一个数据结构。从某个数据库应用程序接收更新事件,然后将其推送到正确的客户端。

B)不,你必须在iPhone端使用Apache和http客户端。 然后您应该知道整个COMET解决方案实际上解决了HTTP协议和Apache / PHP的限制。

Apache旨在处理许多短时连接。到目前为止,我知道只有最新版本的Apache(mpm worker)可以有效地处理大量打开的连接。以前,Apache每个连接都保留一个进程。

Web浏览器对一个Web服务器的并发打开连接的限制(实际上是URL地址,例如www.foo.com,而不是www.foo.com的IP地址)。限制是2个连接。此外,浏览器仅允许与下载主HTML页面的同一服务器进行AJAX连接。

答案 2 :(得分:2)

我写了web server来做这种事情。我通过长轮询通过服务器推送实时更新,例如,我有safari on the iPhone显示该数据。

服务器的给定实例应该能够处理几千个并发客户端而不用太费力。我有一个计划将它们放在层次结构中以允许更多的水平扩展(应该是非常简单的,但不会影响我当前的应用程序)。

答案 3 :(得分:2)

WebSync有一个适用于iPhone的javascript客户端,如果这就是你所追求的

答案 4 :(得分:1)

长期民意调查是否适用于您想要实现的目标?您可以在几行常规Javascript中实现客户端,这将比任何框架都要轻。

在ObjC中实现它(连接,等待响应或超时,重复)也是微不足道的。

我的问题Simple "Long Polling" example code?的答案有希望解释长轮询是多么简单......

基本上你只会像往常一样请求一个URL - 网络服务器会接受连接,但是在它可用之前不会发送任何数据。当您收到数据或连接超时时,您重新连接(并重复)

最复杂的一点是服务器端服务器端,因为你不能使用像Apache这样的常规线程网络服务器,尽管Comet也是如此。

答案 5 :(得分:1)

StreamHub Comet Server适用于开箱即用的iPhone,无需任何插件或任何内容。只是浏览我的iPhone上的网站,所有的例子都有效,不需要安装Flash或其他任何东西。

答案 6 :(得分:0)

您是否希望/通过http为您的应用进行通信?如果没有,您可以使用CFNetwork框架使用套接字(TCP / UDP)来允许您的应用和服务器进行通信。从我所看到的CFNetwork堆栈来看,它非常酷,并且使得读取和写入流相当简单,并允许同步和异步通信。它还允许您在套接字上定义回调,允许您获得接收数据,连接等事件的通知。因此,在您的示例中,您可以通过套接字将信息发送到服务器,然后您可以定义回调将侦听流上的传入数据,然后相应地更新您的应用程序。

编辑:做了一点研究,如果你采用套接字方法,你可能还想看一下NSStream类。它们是构建在CFSocket之上的Cocoa抽象。

答案 7 :(得分:0)

你没有提到你正在使用的服务器技术。但是如果它是微软.net(或任何其他遇到此问题的google),彗星有一个简单的选择:http://www.codeplex.com/ncomet

答案 8 :(得分:-1)

COMET,LightStreamer,AJAX所有垃圾都被打破了。这是TCP的基础知识,没有“保持活动”就可以保证在没有ping流量的情况下保持“保持活动”。所以如果要保证任何体面的可靠性或及时交付,你可以忘记长轮询。

这只是大家在2003年跛行狂热开始时所看到的炒作..