问题 Objective-C网络 - 最佳实践?


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

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

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

还有其他想法吗?

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


4440
2018-02-19 20:44


起源

如果我要再次这样做,我会考虑使用AMQP或类似的消息传递协议,因此更新可以作为推送完成。只是值得深思。 - Allyn


答案:


只要客户端和服务器都是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,使得编写网络代码变得更加容易。


10
2018-02-19 21:14



如果您想在跨平台应用程序中使用DO,GNUStep可以提供很多帮助,但此时您可能不希望将GNUStep用于GUI。 - user57368
啊,好点。我根本没有使用GNUStep分布式对象,所以我不推荐它,但它绝对值得研究OP。 - Barry Wark
我已经尝试并排除了分布式对象;他们只是不合适。我很欣赏这些链接。我应该提到我已经使用AsyncSocket进行了部分实现。 - Allyn


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


2
2018-02-19 20:51





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

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


2
2018-02-19 21:40





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

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


2
2018-02-18 08:49





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

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


0
2018-02-19 21:17