我正在构建一个既有服务器又有客户端的Objective-C应用程序。客户端可以向服务器发送更新,服务器需要能够向每个连接的客户端发送更新。我一直在考虑如何最好地实施这个系统,但我要求你的建议。
目前,我认为当有新的更新时,服务器将使用线程依次将更新发送到每个客户端。如果客户端超时,则会断开连接。
我的网络经验很少,所以我问你的见解。
你认为这个系统能运作良好吗?
如果是这样,您对如何进行线程有任何建议吗?你可以指点我的任何NS课程吗?我想要有一些我可以使用的队列。
还有其他想法吗?
编辑:我不认为客户端数量会超过50左右,最大值。
只要客户端和服务器都是OS X应用程序,并且都可以使用Cocoa框架在Objective-C中编写,我强烈建议您查看 分布式对象 可可的(DO)技术。我不会尝试在这里给出分布式对象的教程,只是解释为什么它可能有用......
DO为您处理异步网络详细信息(您的所有客户端更新可能发生在单个线程上)。此外,与远程对象(客户端到服务器或反之亦然;一旦建立连接,DO是双向的)通信的语义与进程内通信非常相似。换句话说,一旦你有一个对远程对象的引用(真的是一个 NSDistantObject
它充当连接另一端对象的代理),您的客户端代码可以将消息发送到远程对象,就好像它是本地的:
[remoteServer update:client];
来自客户或
[[remoteClientList objectAtIndex:i] update:server];
从服务器。我将在阅读之后留下设置连接和获取remoteServer或remoteClient引用的详细信息 分布式对象编程指南。
使用DO的缺点是你与Cocoa联系在一起;这将是 非常 难以编写使用Distirbuted Objects进行通信的非Cocoa客户端或服务器。如果您有可能想要非Cocoa客户端或服务器实现,则不应使用DO。在这种情况下,我会推荐一些简单的东西,有很多跨平台和语言支持。 HTTP上的REST风格的API是一个不错的选择。看看可可 URL加载系统 有关如何实现HTTP请求和响应的信息的文档。看看Apple的 CocoaHTTPServer 示例代码或code.google.com项目 一样的名字 有关在Cocoa代码中实现HTTP服务器的信息。
作为最后一个选项,你可以看一下Cocoa 流编程指南 如果你想实现自己的网络协议。 NSStream
的子类将允许您侦听网络套接字并处理与该套接字的异步读/写。很多人都在使用 AsyncSocket 以此目的。它包装了(低级)CFStream和CFSocket,使得编写网络代码变得更加容易。
当服务器向客户端发送更新时,让一个线程全部处理它们可能更容易,并且只使用异步套接字。当然,这取决于您必须处理多少客户。
苹果开发者方面有几个网络示例。
我建议您退房的是URLCache,可以下载。
引用Apple示例中的文档:
URLCache是一个示例iPhone应用程序,演示如何从Web下载资源,将其存储在应用程序的数据目录中,以及如何使用资源的本地副本。 URLCache还演示了如何实现几个缓存策略:
一个有趣的选择是 BLIP 来自的协议 Jens Alfke。这就像是一个精简版 嘟:面向消息的网络系统。它基本上为双向消息管道提供了低级抽象,因此您可以专注于在其上层叠通信协议。
它有一些有价值的追随者,如 马库斯扎拉 (CoreData圣经的作者)和Flying Meat软件的Gus Mueller。
我不知道你打算如何设计你的系统,但通常服务器无法连接到客户端;客户必须发起沟通。对于50个客户端的下限,您可能不会看到类似Web服务器/客户端的实现......
也就是说,基本上有两种方法来处理客户端服务器通信:
1.客户端定期轮询服务器以获取更新
2.客户端保持与服务器的连接,并且服务器以众所周知的(如双方都理解的)协议进行响应。