2009-02-19 98 views
11

我正在构建一个既有服务器又有客户端的Objective-C应用程序。客户端可以将更新发送到服务器,并且服务器需要能够向每个连接的客户端发送更新。我一直在想如何最好地实施这个系统,但是我正在寻求你的建议。Objective-C网络 - 最佳实践?

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

你认为这个系统可以正常工作吗? 如果是这样,你有关于如何执行线程的任何建议?你可以指点我的任何NS课程?我想我应该可以使用某种队列。

还有其他想法吗?

编辑:我不希望客户端数量大大超过50左右,在最大。

+0

如果我要再次这样做,我会考虑使用AMQP或类似的消息传递协议,以便更新可以按推。只是思考的食物。 – Allyn 2010-11-01 16:02:00

回答

10

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

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

[remoteServer update:client]; 
从客户端

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

从服务器。在阅读Distributed Objects programming guide后,我将留下设置连接的细节,以及获取remoteServer或remoteClient的参考信息。

使用DO的缺点是你被绑在可可上;这将是非常难难以编写非可可客户端或使用Distirbuted对象进行通信的服务器。如果有机会你可能想要使用非Cocoa客户端或服务器实现,则不应该使用DO。在这种情况下,我会推荐一些简单的东西,并提供大量的跨平台和语言支持。基于HTTP的REST风格的API是一个不错的选择。查看Cocoa URL Loading System文档以获取有关如何实现HTTP请求和响应的信息。查看Apple的CocoaHTTPServer示例代码或same name的code.google.com项目,获取有关在您的Cocoa代码中实现HTTP服务器的信息。

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

+1

如果您想在跨平台应用程序中使用DO,GNUStep可以提供很多帮助,尽管此时您可能不想为GUI使用GNUStep。 – user57368 2009-02-19 21:49:43

2

当服务器向客户端发送更新时,只需要一个线程处理它们,并且只使用异步套接字就可能更容易。当然,这取决于您需要处理的客户数量。

0

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

也就是说,基本上有两种方式来处理客户端服务器通信: 1.客户端调查服务器定期获取更新 2.客户端保持连接对服务器开放,并且服务器以众所周知的方式响应(如双方都理解的那样)协议。

2

在苹果开发者方面有几个网络示例。 我会建议你检查一下是URLCache,它可以下载。 从Apple的文档引用这个例子:

Urlcache文件是一个示例iPhone应用程序,演示如何下载资源从网上,它存储在应用程序的数据目录,并使用资源的本地副本。 Urlcache文件还演示如何实现一对夫妇缓存策略:

2

一个有趣的选择是从Jens AlfkeBLIP协议。这就像是一个简化的版本BEEP:面向消息的网络系统。它基本上为双向消息管道提供了低级抽象,因此您可以专注于将通信协议层叠到顶层。

它有一些值得追随的人,比如Marcus Zarra(CoreData圣经的作者)和Flying Meat软件的Gus Mueller。