19

我正在寻找从我的服务器到我的 iPhone 应用程序的某种套接字/COMET 类型的功能。本质上,只要用户设法在服务器上设置任意对象“脏”,比如更新他们的地址……反馈应该从服务器推送到任何保持对服务器进行实时轮询的客户端。我想这个流行语是彗星。我知道有用于 Web 浏览器应用程序的 DWR,所以我在想,也许最好在我的每个控制器中设置一个隐藏的 UIWebView,这样我就可以从他们的 javascript 框架中开箱即用 COMET?有没有更优雅的方法?

4

9 回答 9

10

有几个解决方案可用于使用STOMP客户端。

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

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

希望有帮助!

于 2008-12-03T18:20:06.743 回答
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 个连接。此外,浏览器将只允许 AJAX 连接到从其下载主 HTML 页面的同一服务器。

于 2009-03-13T10:21:03.777 回答
2

我写了一个网络服务器来做这种事情。我正在通过长时间轮询的服务器推送实时更新,例如,我在 iPhone 上进行了 safari显示该数据。

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

于 2008-12-03T18:30:51.527 回答
2

WebSync有一个可以在 iPhone 上运行的 javascript 客户端,如果你想要的话

于 2009-11-20T16:11:58.157 回答
1

长时间轮询会为您想要实现的目标工作吗?您可以在几行常规 Javascript 中实现客户端,这将比任何框架都轻。

在 ObjC 中实现它也很简单(连接,等待响应或超时,重复)

我的问题的答案简单的“长轮询”示例代码?希望能解释一下长轮询是多么简单..

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

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

于 2008-12-20T06:43:08.540 回答
1

StreamHub Comet Server 开箱即可与 iPhone 配合使用,无需任何插件或任何东西。只需在我的 iPhone 上浏览他们的网站,所有示例都有效,不需要安装 Flash 或任何东西。

于 2010-05-29T07:31:18.410 回答
0

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

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

于 2009-03-11T01:41:24.787 回答
0

你没有提到你正在使用什么服务器端技术。但如果它是 microsoft .net(或任何其他遇到此问题的谷歌用户),comet 有一个简单的选项:http: //www.codeplex.com/ncomet

于 2009-03-16T13:24:06.893 回答
-1

COMET、LightStreamer、AJAX 所有这些垃圾都被破坏了。TCP 的基础是,如果没有 ping 流量,就无法保证“保持活动”。因此,如果要保证任何体面的可靠性或及时交付,您可以忘记长轮询。

这只是 2003 年跛脚狂热开始时每个人都看到的炒作。

于 2009-03-16T23:15:52.743 回答