代码之家  ›  专栏  ›  技术社区  ›  jbrennan

在Mac OS X上进行进程间通信的最佳方法

  •  23
  • jbrennan  · 技术社区  · 15 年前

    我正在考虑在Mac上构建一个Cocoa应用程序,它有一个后端守护进程(实际上可能只是一个无头Cocoa应用程序),以及0个或更多本地运行的“客户机”应用程序(如果可能,我也希望支持远程客户机;远程客户机只能是其他Mac或iPhone OS设备)。

    正在传输的数据将是相当琐碎的,主要是文本和命令(我猜无论如何都可以用文本表示),以及偶尔的小文件(可能是图像)。

    我已经研究了几种方法来完成这个任务,但我不确定哪种方法最适合手头的任务。我考虑过的事情:

    • 读写文件(_yes),非常基本,但不可扩展。
    • 纯套接字(我对套接字没有经验,但我似乎认为可以使用它们在本地和网络上发送数据。虽然在可可里做每件事似乎很麻烦
    • 分布式对象:对于这样的任务似乎不太合适
    • NSConnection :我真的不知道这个类是做什么的,但我在一些IPC搜索结果中读到过它。

    我确信我遗漏了一些东西,但我很惊讶地发现这个话题缺乏资源。

    3 回复  |  直到 15 年前
        1
  •  15
  •   Community CDub    8 年前

    我目前正在研究同样的问题。对我来说,以后添加Windows客户端的可能性会使情况变得更复杂;在您的情况下,答案似乎更简单。

    关于您考虑的选项:

    1. 控制文件: 虽然可以通过控制文件进行通信,但您必须记住,这些文件需要通过相关机器之间的网络文件系统进行通信。因此,网络文件系统是对实际网络基础设施的抽象,但并不能提供网络通常具有的全部功能和灵活性。 实施: 实际上,每对客户机/服务器至少需要两个文件:一个服务器用于向客户机发送请求的文件和一个响应文件。如果每个进程都可以通过两种方式进行通信,则需要复制此过程。此外,客户机和服务器都是在“拉”的基础上工作的,也就是说,它们需要频繁地重新访问控制文件,并查看是否有新的内容被交付。

      这个解决方案的优点是它最小化了学习新技术的需要。最大的缺点是它对程序逻辑有着巨大的需求;很多事情需要由您来处理(文件是一块写的,还是任何一方都会收到不一致的文件?检查应多久执行一次?我需要担心文件系统吗,比如缓存等?我可以在以后添加加密而不去玩弄程序代码之外的东西吗?……)

      如果可移植性是一个问题(据我从你的问题中了解,情况并非如此),那么这个解决方案很容易移植到不同的系统,甚至不同的编程语言。但是,我不知道iPhone操作系统的任何网络文件系统,但我对此并不熟悉。

    2. 插座: 编程接口当然是不同的;根据您对socket编程的经验,这可能意味着您有更多的工作要先学习它,然后再调试它。 实施 :实际上,您将需要与以前类似的逻辑,即客户机和服务器通过网络通信。这种方法的一个明确的优点是,进程可以在“推”的基础上工作,也就是说,它们可以在套接字上监听,直到消息到达,这优于定期检查控制文件。网络损坏和不一致也是您不关心的问题。此外,您(可能)对建立连接的方式有更多的控制,而不是依赖程序控制之外的东西(同样,如果您稍后决定添加加密,这一点很重要)。

      其优点是,很多事情都会从您的肩上卸下,这会影响到1中的实现。缺点是,为了确保发送和接收正确的信息(文件类型等),您仍然需要实质性地更改程序逻辑。

      根据我的经验,可移植性(即,易于转换到不同的系统甚至编程语言)非常好,因为任何与POSIX远程兼容的东西都可以工作。

      [ 编辑: 尤其是,一旦你交流二进制数,尾数就成了一个问题,你必须手动处理这个问题-这是一个常见的!!)上述“正确信息”问题的特例。它会咬你,例如当你有一个PowerPC和一个IntelMac交谈时。这种特殊情况随着解决方案3.+4消失。所有其他“正确信息”问题将一起讨论。]

    3. + 4。 分布式对象: 这个 NSProxy 类集群用于实现分布式对象。 NSConnection 负责将远程连接设置为发送信息的先决条件,因此一旦了解了如何使用此系统,您还可以了解分布式对象。^)

      其思想是,您的高级程序逻辑不需要更改(即,您的对象通过消息进行通信并接收结果,消息以及返回类型与您在本地实现中使用的类型相同),而无需担心网络基础结构的细节。至少理论上是这样。 实施: 我现在也在做这个工作,所以我的理解仍然有限。据我所知,您确实需要设置某种结构,即,您仍然需要决定哪些进程(本地和/或远程)可以接收哪些消息;这就是 NSCONT 做。此时,您隐式地定义了客户机/服务器体系结构,但不需要担心2中提到的问题。

      在gnustep Project Server上有两个明确的示例介绍;它说明了该技术的工作原理,是一个很好的实验起点: http://www.gnustep.org/resources/documentation/Developer/Base/ProgrammingManual/manual_7.html

      不幸的是,缺点是完全失去了与其他系统的兼容性(尽管您仍然可以很好地使用您提到的仅限Mac和iPhone/iPad的设置),并且失去了与其他语言的可移植性。gnustep与objective-c在最好的情况下是代码兼容的,但是没有办法进行通信 之间 gnustep和cocoa,请参见我的问题2编辑: CORBA on Mac OS X (Cocoa)

      [ 编辑: 我刚刚发现了另一条我不知道的信息。我查过了 NS-代理 在iPhone上可用,我没有检查分布式对象机制的其他部分是否可用。根据此链接: http://www.cocoabuilder.com/archive/cocoa/224358-big-picture-relationships-between-nsconnection-nsinputstream-nsoutputstream-etc.html (在页面上搜索“iphone操作系统”)它们不是。如果您现在需要使用iPhone/iPad,这将排除此解决方案。]

    综上所述,学习(实现和调试)新技术的努力与编写低级通信逻辑的努力之间存在着权衡。虽然分布式对象方法承担了您大部分的负担,并且在程序逻辑中产生了最小的变化,但是它是最难学习的,而且(不幸的是)也是最不可移植的。

        2
  •  13
  •   Georg Fritzsche    15 年前

    免责声明: 分布式对象是 not available on iPhone .


    为什么你会发现 distributed objects 不雅?它们在这里听起来很相配:

    • 基本类型和Objective-C类的透明编组
    • 不管客户是本地的还是远程的
    • 对于基于Cocoa的应用程序,没有多少额外工作

    文档可能会使它听起来比实际工作更有效,但您基本上要做的就是干净地使用协议,导出或分别连接到服务器根对象。
    在给定的场景中,其余的应该在幕后自动发生。

        3
  •  6
  •   NSSplendid    15 年前

    我们正在使用 ThoMoNetworking 它工作正常,安装速度也很快。基本上,它允许您在本地网络中发送nscoding兼容的对象,但是如果客户机和服务器在同一台机器上,当然也可以工作。作为基础类的包装器,它负责配对、重新连接等。

    推荐文章