我正在探索在Erlang中编写应用程序的可能性,但它需要有一部分用Cocoa编写(可能是Objective-C)。我希望前端和后端能够轻松进行通信。怎么能做到最好?
我可以考虑使用C端口和连接进程,但我认为我想要一个相反的情况(前端启动并连接到后端)。有命名管道(FIFO),或者我可以通过TCP端口或命名的BSD套接字使用网络通信。有没有人有这方面的经验?
答案 0 :(得分:10)
一种方法是让应用程序的Erlang核心成为Cocoa前端使用您设计的简单协议通过Unix域套接字进行通信的守护进程。
使用Unix域套接字意味着Erlang守护程序可以由launchd
按需启动,并且Cocoa前端可以通过环境变量找到要使用的套接字的路径。这使得应用程序和守护进程之间的集合变得微不足道,并且它也使得开发多个前端(或者可能是包含与守护进程通信的框架)变得简单。
Mac OS X launchd
系统非常酷。如果您指定应通过安全的Unix域套接字按需启动作业,launchd
将实际创建具有适当权限的套接字本身,并通过作业属性列表中指定的环境变量公布其位置。作业在启动时,实际上会在launchd
执行简单签入时将文件描述符传递给套接字。
最终这意味着前端的整个过程打开套接字与守护进程通信,launchd
启动守护进程,响应通信的守护进程可以是安全的,即使前端也是如此并且守护程序以不同的权限级别运行。
答案 1 :(得分:2)
Theo与NSTask,NSPipe和NSFileHandle合作的方式之一。您可以从查看CouchDBX http://couchprojects.googlecode.com/svn/trunk/unofficial-binary-releases/CouchDBX/
的代码开始端口是可能的,但根本不好。
有什么理由说明为什么不能简单地用mochiweb和json通信处理这种通信?
答案 2 :(得分:1)
通常在创建前面UNIX命令或其他无头程序的Cocoa应用程序时,使用NSTask
:
使用NSTask类,您的程序可以将另一个程序作为子进程运行,并可以监视该程序的执行情况。 NSTask对象创建一个单独的可执行实体;它与NSThread的不同之处在于它不会与创建它的进程共享内存空间。
任务在由若干项的当前值定义的环境中运行:当前目录,标准输入,标准输出,标准错误以及任何环境变量的值。默认情况下,NSTask对象从启动它的进程继承其环境。如果任务的任何值应该不同,例如,如果当前目录应该更改,则必须在启动任务之前更改该值。任务的环境在运行时无法更改。
您可以通过stdin
/ stdout
/ stderr
与后端流程进行沟通。基本上NSTask
是exec
(或fork
或system
周围的高级包装器,我总是忘记它的区别。)
根据我的理解,你不希望Erland程序成为持续运行的后台守护程序,但如果你这样做,请使用@Chris's建议。
答案 3 :(得分:1)
NSTask和Unix域套接字方法都是很好的建议。值得关注的是正在开发的Erlang FFI实现:
答案 4 :(得分:1)
erl_call应该可以在NSTask中使用。我在Textmate命令中使用它,速度非常快。将erl_call与OTP gen_server结合使用可以让您相对轻松地保持持久的后端状态。有关详细信息,请参阅我在博客上关于erl_call的帖子。
答案 5 :(得分:1)
使用NSTask,您也可以考虑使用PseudoTTY.app(允许交互式通信)!
另一个感兴趣的示例代码可能是BigSQL,一个PostgreSQL客户端,它允许用户将SQL发送到服务器并显示结果。
open -a Safari http://web.archive.org/web/20080324145441/http://www.bignerdranch.com/applications.shtml