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

目前,我认为当有新的更新可用时,服务器将使用线程将更新依次发送给每个客户端。如果客户端超时,它们就会断开连接。我的网络经验很少,所以想请教您的见解。

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

还有其他想法吗?

编辑:我预计客户数量最多不会超过 50 人左右。

有帮助吗?

解决方案

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

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

[remoteServer update:client];

来自客户或

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

从服务器。阅读完后,我将留下设置连接以及获取远程服务器或远程客户端参考的详细信息 分布式对象编程指南.

使用 DO 的缺点是你必须依赖 Cocoa;这将是 非常 编写使用分布式对象进行通信的非 Cocoa 客户端或服务器很困难。如果您有可能想要非 Cocoa 客户端或服务器实现,那么您不应该使用 DO。在这种情况下,我会推荐一些简单的、具有大量跨平台和语言支持的东西。基于 HTTP 的 REST 风格的 API 是一个不错的选择。看看可可 URL加载系统 有关如何实现 HTTP 请求和响应的信息的文档。看看苹果的 CocoaHTTP服务器 示例代码或 code.google.com 项目 一样的名字 有关在 Cocoa 代码中实现 HTTP 服务器的信息。

作为最后一个选择,您可以看看 Cocoa 流编程指南 如果你想实现自己的网络协议。 NSStream的子类将允许您侦听网络套接字并处理对该套接字的异步读取/写入。很多人都用 异步套接字 以此目的。它包装了(较低级别的)CFStream 和 CFSocket,并使编写网络代码变得更加容易。

其他提示

当服务器发送更新到客户端,它可能会更容易只需要一个线程处理所有这些,只是使用异步插座。当然,这将取决于你有多少客户处理过。

有一个在苹果显影剂侧几个联网的例子。 一个我会建议您检查出是Urlcache文件,它可以下载。 从Apple的文档引用此示例:

  

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

一个有趣的选择是 BLIP 协议来自 延斯·阿尔夫克. 。这就像一个精简版 :面向消息的网络系统。它基本上为双向消息管道提供了低级抽象,因此您可以专注于在其之上分层通信协议。

它有一些值得追随者,例如 马库斯·扎拉 (CoreData 圣经的作者)和 Flying Meat 软件的 Gus Mueller。

我不知道您打算如何设计你的系统,但通常是服务器无法连接到客户端;客户端必须启动通信。随着50个客户的低限,你可能无法在寻找一个web服务器/客户端类实现...

这就是说,基本上有两种方法来处理客户端服务器通信: 1.客户端轮询服务器定期得到更新 2.客户端保持到服务器打开的连接和服务器以公知的响应(如在双方都明白它)协议。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top