Objective-C网络 - 最佳实践?

时间:2009-02-19 20:44:53

标签: objective-c cocoa networking communication-protocol

我正在构建一个既有服务器又有客户端的Objective-C应用程序。客户端可以向服务器发送更新,服务器需要能够向每个连接的客户端发送更新。我一直在考虑如何最好地实施这个系统,但我要求你提出建议。

目前,我认为当有新的更新时,服务器将使用线程依次将更新发送到每个客户端。如果客户端超时,则会断开连接。 我的网络经验很少,所以问你的见解。

你认为这个系统会运作良好吗? 如果是这样,您对如何进行线程有任何建议吗?你可以指点我的任何NS课程吗?我想要有一些我可以使用的队列。

还有其他想法吗?

编辑:我认为客户端数量不会超过50左右,最大值

5 个答案:

答案 0 :(得分:10)

只要客户端和服务器都是OS X应用程序,并且都可以使用Cocoa框架在Objective-C中编写,我强烈建议您查看Cocoa中的Distributed Objects(DO)技术。我不会尝试在这里给出分布式对象的教程,只是解释为什么它可能有用......

DO为您处理异步网络详细信息(您的所有客户端更新都可能发生在单个线程上)。此外,与远程对象(客户端到服务器或反之亦然;一旦建立连接后DO是双向的)通信的语义与进程内通信非常相似。换句话说,一旦你有一个对远程对象的引用(实际上是一个NSDistantObject作为连接另一端对象的代理),你的客户端代码就可以向远程对象发送消息,就好像它是当地的:

[remoteServer update:client];

来自客户或

[[remoteClientList objectAtIndex:i] update:server];

来自服务器。我将在阅读Distributed Objects programming guide后留下设置连接和获取remoteServer或remoteClient引用的详细信息。

使用DO的缺点是你与Cocoa联系在一起;使用Distirbuted Objects进行通信的非Cocoa客户端或服务器很难非常。如果您可能希望拥有非Cocoa客户端或服务器实现,则不应使用DO。在这种情况下,我会推荐一些简单的东西,有很多跨平台和语言支持。基于HTTP的REST风格的API是一个不错的选择。查看Cocoa URL Loading System文档,了解有关如何实现HTTP请求和响应的信息。有关在Cocoa代码中实现HTTP服务器的信息,请查看Apple的CocoaHTTPServer示例代码或same name的code.google.com项目。

作为最后一个选项,如果要实现自己的网络协议,可以查看Cocoa Stream Programming GuideNSStream的子类将允许您侦听网络套接字并处理与该套接字的异步读/写。很多人为此目的使用AsyncSocket。它包装了(低级)CFStream和CFSocket,使得编写网络代码变得更加容易。

答案 1 :(得分:2)

当服务器向客户端发送更新时,让一个线程全部处理它们可能会更容易,并且只使用异步套接字。当然,这取决于您必须处理多少客户。

答案 2 :(得分:2)

苹果开发者方面有几个网络示例。 我建议您退房的是URLCache,可以下载。 引用Apple的文档来举例说明:

  

URLCache是​​一个示例iPhone应用程序,演示了如何从Web下载资源,将其存储在应用程序的数据目录中,以及如何使用资源的本地副本。 URLCache还演示了如何实现一些缓存策略:

答案 3 :(得分:2)

一个有趣的选项是来自BLIPJens Alfke协议。它就像BEEP的精简版:面向消息的网络系统。它基本上为双向消息管道提供了低级抽象,因此您可以专注于在其上层叠通信协议。

它有一些有价值的粉丝,如Marcus Zarra(CoreData圣经的作者)和Flying Meat软件的Gus Mueller。

答案 4 :(得分:0)

我不知道你打算如何设计你的系统,但通常服务器无法连接到客户端;客户必须发起沟通。对于50个客户端的下限,您可能不会看到类似Web服务器/客户端的实现......

也就是说,基本上有两种方法来处理客户端服务器通信: 1.客户端定期轮询服务器以获取更新 2.客户端保持与服务器的连接,服务器以众所周知的(如双方都理解的)协议进行响应。

相关问题