jbr*_*nan 26 sockets networking cocoa ipc nsconnection
我正在寻找在Mac上构建一个带有后端守护程序进程的Cocoa应用程序(可能只是一个大多数无头的Cocoa应用程序),以及在本地运行的0个或更多"客户端"应用程序(尽管我可能会这样做)也支持远程客户端;远程客户端只能是其他Mac或iPhone OS设备).
传递的数据将是相当简单的,大多数只是文本和命令(我猜想无论如何都可以表示为文本),也可能是偶尔的小文件(可能是图像).
我已经看了几个方法,但是我不确定哪个方法对于手头的任务来说"最好".我考虑过的事情:
NSConnection
:我无法弄清楚这个类甚至做了什么,但我已经在一些IPC搜索结果中读到了它我确信有些东西我不见了,但我很惊讶地发现这个话题缺乏资源.
use*_*472 15
我目前正在研究相同的问题.对我来说,以后添加Windows客户端的可能性使情况更加复杂; 在你的情况下,答案似乎更简单.
关于您考虑的选项:
控制文件:虽然可以通过控制文件进行通信,但您必须记住,文件需要通过所涉及机器之间的网络文件系统进行通信.因此,网络文件系统可以作为实际网络基础设施的抽象,但不能提供网络通常具有的全部功能和灵活性.实现:实际上,每对客户端/服务器至少需要两个文件:服务器用于向客户端发送请求的文件和响应文件.如果每个进程都可以双向通信,则需要复制它.此外,客户端和服务器都在"拉"的基础上工作,即,他们需要经常重新访问控制文件并查看是否已经发送了新的内容.
该解决方案的优点在于它最大限度地减少了学习新技术的需要.最大的缺点是它对程序逻辑有很大的要求; 你需要处理很多事情(这些文件是一体编写的还是会发生任何一方收集不一致的文件?应该多久检查一次?我是否需要担心文件系统,比如缓存等?我可以在以后添加加密而不需要处理程序代码之外的东西吗?...)
如果可移植性是一个问题(据我所知,从你的问题不是这样),那么这个解决方案很容易移植到不同的系统甚至不同的编程语言.但是,我不知道iPhone OS的任何网络文件系统,但我不熟悉这一点.
套接字:编程接口肯定是不同的; 根据您对套接字编程的经验,这可能意味着您需要先学习更多的工作并稍后进行调试.实现:实际上,您需要一个与以前类似的逻辑,即客户端和服务器通过网络进行通信.这种方法的明确优点是流程可以在"推送"的基础上工作,即,它们可以在套接字上侦听,直到消息到达,这优于定期检查控制文件.网络损坏和不一致也不是您的担忧.此外,您(可能)可以更好地控制建立连接的方式,而不是依赖于程序控制之外的事情(同样,如果您决定稍后添加加密,这一点很重要).
优点是很多事情都会从你的肩膀上消失,这会打扰1中的实现.缺点是你仍然需要大幅改变你的程序逻辑,以确保你发送和接收正确的信息(文件类型)等等.).
根据我的经验,可移植性(即,易于转换到不同的系统甚至编程语言)是非常好的,因为任何甚至与POSIX远程兼容的工作.
[ 编辑:特别是,一旦你传达二进制数字endianess成为一个问题,你必须手动处理这个问题 - 这是我上面提到的"正确信息"问题的常见(!)特殊情况.当你有一台PowerPC与英特尔Mac通话时,它会咬你.这个特殊情况随着解决方案3. + 4而消失.将所有其他"正确信息"问题放在一起.]
+4.分布式对象:本NSProxy
类集群用于实现分布式对象.NSConnection
负责设置远程连接作为发送信息的先决条件,因此一旦了解了如何使用该系统,您还可以了解分布式对象.; ^)
我们的想法是,您的高级程序逻辑不需要更改(即,您的对象通过消息进行通信并接收结果,并且消息与返回类型一致,与您在本地实现中使用的相同),而无需打扰网络基础设施的细节.好吧,至少在理论上.实施:我现在也正在研究这个问题,所以我的理解仍然有限.据我所知,您确实需要设置某种结构,即您仍然需要决定哪些进程(本地和/或远程)可以接收哪些消息; 这是做什么的NSConnection
.此时,您隐式定义了客户端/服务器体系结构,但您不必担心2中提到的问题.
在Gnustep项目服务器上有两个明确的例子介绍; 它说明了该技术的工作原理,是实验的良好起点:http: //www.gnustep.org/resources/documentation/Developer/Base/ProgrammingManual/manual_7.html
不幸的是,缺点是完全失去兼容性(尽管你仍然可以使用你提到的Mac和iPhone/iPad的设置)与其他系统兼容并且丢失了对其他语言的可移植性.带有Objective-C的Gnustep充其量是代码兼容的,但Gnustep和Cocoa 之间没有办法进行通信,请参阅我对第2题的编辑:Mac OS X上的CORBA(Cocoa)
[ 编辑:我刚刚看到另一条我不知道的信息.虽然我已经检查NSProxy
过iPhone上可用,但我没有检查分布式对象机制的其他部分是否可用.根据这个链接:http://www.cocoabuilder.com/archive/cocoa/224358-big-picture-relationships-between-nsconnection-nsinputstream-nsoutputstream-etc.html(搜索页面中的短语"iPhone OS")他们不是.如果您此时要求使用iPhone/iPad,这将排除此解决方案.]
总而言之,在一方面学习(以及实现和调试)新技术和另一方面手工编写低级通信逻辑的努力之间存在权衡.虽然分布式对象方法占用了大部分负担并导致程序逻辑中的最小变化,但它是最难学习的,并且(不幸的是)最不便携.
Geo*_*che 13
为什么你发现分布式对象不优雅?他们听起来像是一个很好的匹配:
文档可能听起来像实际上更多的工作,但你基本上要做的就是干净地使用协议并导出或分别连接到服务器根对象.
其余应该在给定场景中为您自动幕后发生.
我们正在使用ThoMoNetworking,它工作正常,设置快.基本上它允许您在本地网络中发送符合NSCoding的对象,但是当客户端和服务器在同一台机器上时当然也可以工作.作为基础课程的包装,它负责配对,重新连接等.
归档时间: |
|
查看次数: |
13719 次 |
最近记录: |