可可 – 在Mac OS X上执行进程间通信的最佳方式

可可 – 在Mac OS X上执行进程间通信的最佳方式,第1张

概述我正在Mac上建立一个Cocoa应用程序,后端进程守护进程(实际上只是一个大部分是头无头可可的应用程序,大概),以及在本地运行的0个或更多的“客户端”应用程序(尽管如果可能,我会喜欢支持远程客户端;远程客户端将只会是其他Mac或iPhone *** 作系统设备)。 正在传达的数据将是相当微不足道的,大多只是文本和命令(我猜这可以被表示为文本),也可能是偶尔的小文件(可能是图像)。 我已经看了几种方法来做到 我正在Mac上建立一个Cocoa应用程序,后端进程守护进程(实际上只是一个大部分是头无头可可的应用程序,大概),以及在本地运行的0个或更多的“客户端”应用程序(尽管如果可能,我会喜欢支持远程客户端;远程客户端将只会是其他Mac或iPhone *** 作系统设备)。

正在传达的数据将是相当微不足道的,大多只是文本和命令(我猜这可以被表示为文本),也可能是偶尔的小文件(可能是图像)。

我已经看了几种方法来做到这一点,但我不知道哪个是最好的手段的任务。我考虑过的事情

>读取和写入文件(…是),非常基本但不是非常可扩展。
>纯插座(我没有套接字的经验,但我似乎认为我可以使用它们在本地和网络上发送数据,虽然在Cocoa中做的一切似乎很麻烦
>分布式对象:对于像这样的任务来说似乎不太适合
> NSConnection:我不知道这个类甚至还有什么,但是我已经在一些IPC搜索结果中看过了

我相信有一些我失踪的东西,但是我很惊讶地发现这个话题缺乏资源。

解决方法 我目前正在研究同样的问题。对我来说,稍后添加windows客户端的可能性使得情况更加复杂;在你的情况下,答案似乎更简单。

关于您考虑的选项:

>控制文件:可以通过控制文件进行通信时,必须记住,文件需要通过所涉及的机器之间的网络文件系统进行通信。因此,网络文件系统作为实际网络基础设施的抽象,但不能提供网络通常拥有的全部功能和灵活性。实现:实际上,您需要为每对客户端/服务器至少拥有两个文件:服务器用于向客户端发送请求的文件和响应的文件。如果每个进程可以通过两种方式进行通信,则需要复制此 *** 作。此外,客户端和服务器都以“拉”方式工作,即,他们需要经常重新访问控制文件,并查看是否已经发送了新的信息。

该解决方案的优点在于它最大限度地减少了学习新技术的需求。最大的缺点是它对程序逻辑有很大的要求;很多事情需要照顾你(文件将被写成一个单独的或者是发生任何一方拿起不一致的文件吗?检查需要多长时间?我需要担心文件系统,像缓存等等?我可以加密加密,而不用在程序代码之外的事情吗?…)

如果可移植性是一个问题(根据您的问题,我认为不是这样),那么该解决方案将很容易地移植到不同的系统甚至不同的编程语言中。但是,我不知道任何网络文件ystem为iPhone *** 作系统,但我不熟悉这一点。
插座:编程接口肯定是不同的;取决于你的套接字编程经验,这可能意味着你有更多的工作要先学习,稍后再进行调试。实现:实际上,您将需要与之前类似的逻辑,即通过网络进行通信的客户端和服务器。这种方法的确定之处在于,进程可以在“推”的基础上工作,即,它们可以在套接字上监听,直到消息到达,其优先于定期检查控制文件。网络腐败和不一致也不是您所关心的。此外,您(可能)可以更好地控制连接建立的方式,而不是依赖于程序控制之外的其他 *** 作(再次,如果您以后决定添加加密,则这很重要)。

优点是很多事情都会脱离你的肩膀,这将导致1中的实现。缺点是,您仍然需要大量更改程序逻辑,以确保您发送和接收正确的信息(文件类型等等。)。

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

[编辑:特别是,一旦你传递二进制数字endianess成为一个问题,你必须手动处理这个问题 – 这是一个常见的(!)特殊情况下我上面提到的“正确的信息”问题。它会咬你,例如当您有一个PowerPC与Intel Mac通话时。这个特殊情况与解决方案消失3. 4.将所有其他“正确的信息”问题。
> 4.分布式对象:nsproxy类集群用于实现分布式对象。 NSConnection负责将远程连接设置为发送信息的前提条件,所以一旦了解了如何使用该系统,您也可以理解分布式对象。 ; ^)

这个想法是,您的高级程序逻辑不需要更改(即,您的对象通过消息进行通信并接收结果,并且消息与返回类型一起与本地实现中使用的消息相同),而无需打扰网络基础设施的细节。那么至少在理论上呢实施:我现在也在这个工作,所以我的理解还是有限的。据我所知,您需要设置一个特定的结构,即您仍然必须决定哪些进程(本地和/或远程)可以接收哪些消息;这是NSConnection所做的。在这一点上,您隐式定义了客户端/服务器架构,但您不需要担心2中提到的问题。

在Gnustep项目服务器上有两个明确示例的介绍;它说明了该技术的工作原理,是实验的良好起点:
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)

[编辑:我刚刚碰到另一件我不知道的信息。虽然我已经检查了nsproxy在iPhone上可用,但我并没有检查分布式对象机制的其他部分是否是。根据这个链接:http://www.cocoabuilder.com/archive/cocoa/224358-big-picture-relationships-between-nsconnection-nsinputstream-nsoutputstream-etc.html(在页面上搜索短语“iPhone OS”)他们不是。如果您现在需要使用iPhone / iPad,这将排除此解决方案。]

因此,总而言之,学习(和实现和调试)新技术的努力与另一方面手写编码较低级别的通信逻辑之间存在权衡。尽管分布式对象方法占用了大部分的肩膀,并且在程序逻辑中引起了最小的变化,但是最难学习的也是最不可移植的。

总结

以上是内存溢出为你收集整理的可可 – 在Mac OS X上执行进程间通信的最佳方式全部内容,希望文章能够帮你解决可可 – 在Mac OS X上执行进程间通信的最佳方式所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1040804.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存