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