我正在探索用 Erlang 编写应用程序的可能性,但它需要有一部分用 Cocoa(大概是 Objective-C)编写。我希望前端和后端能够轻松通信。如何最好地做到这一点?

我可以考虑使用 C 端口和连接的进程,但我想我想要相反的情况(前端启动并连接到后端)。有命名管道 (FIFO),或者我可以通过 TCP 端口或命名 BSD 套接字使用网络通信。有人有这方面的经验吗?

有帮助吗?

解决方案

一种方法是让应用程序的 Erlang 核心成为一个守护进程,Cocoa 前端使用您设计的一些简单协议通过 Unix 域套接字与其进行通信。

使用 Unix 域套接字意味着 Erlang 守护进程可以通过以下方式按需启动: launchd Cocoa 前端可以通过环境变量找到要使用的套接字的路径。这使得应用程序和守护进程之间的交会变得微不足道,并且还使得开发多个前端(或者可能是包装与守护进程通信的框架)变得简单。

Mac OS X launchd 这样的系统真的很酷。如果您指定应通过安全 Unix 域套接字按需启动作业, launchd 实际上将创建具有适当权限的套接字本身,并通过作业属性列表中指定的环境变量通告其位置。该作业启动时,实际上将通过以下方式将文件描述符传递给套接字: launchd 当它进行简单的登记时。

最终这意味着前端打开socket与守护进程通信的整个过程, launchd 即使前端和守护进程以不同的权限级别运行,启动守护进程以及响应通信的守护进程也是安全的。

其他提示

一种方法是 Theo 的 NSTask、NSPipe 和 NSFileHandle 方法。您可以首先查看 CouchDBX 的代码 http://couchprojects.googlecode.com/svn/trunk/unofficial-binary-releases/CouchDBX/

端口是可能的,但一点也不好。

是否有某种原因导致这种通信不能简单地通过 mochiweb 和 json 通信来处理?

通常,当创建面向 UNIX 命令或其他无头程序的 Cocoa 应用程序时,您使用 NSTask:

使用 NSTask 类,您的程序可以将另一个程序作为子进程运行,并可以监视该程序的执行。NSTask 对象创建一个单独的可执行实体;它与 NSThread 的不同之处在于它不与创建它的进程共享内存空间。

任务在由多个项目的当前值定义的环境中运行:当前目录、标准输入、标准输出、标准错误以及任何环境变量的值。默认情况下,NSTask 对象从启动它的进程继承其环境。如果任务有任何不同的值,例如,如果当前目录应更改,则必须在启动任务之前更改该值。任务运行时其环境无法更改。

您可以通过以下方式与后端进程通信 stdin/stdout/stderr. 。基本上 NSTask 是一个高级包装器 exec (或者 fork 或者 system, ,我总是忘记区别)。

据我了解,您不希望 Erland 程序成为连续运行的后台守护进程,但如果您这样做,请选择 @克里斯的 建议。

NSTask 和 Unix 域套接字方法都是很好的建议。值得关注的是正在进行中的 Erlang FFI 实现:

http://muvara.org/crs4/erlang/ffi

erl_call 应该可以从 NSTask 中使用。我通过 Textmate 命令使用它,速度非常快。将 erl_call 与 OTP gen_server 相结合可以让您相对轻松地保持持久的后端状态。有关更多详细信息,请参阅我的博客中关于 erl_call 的帖子。

使用 NSTask 您也可以考虑使用 伪TTY.app (允许互动交流)!

另一个感兴趣的示例代码可能是 BigSQL,它是一个 PostgreSQL 客户端,使用户能够将 SQL 发送到服务器并显示结果。

open -a Safari http://web.archive.org/web/20080324145441/http://www.bignerdranch.com/applications.shtml
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top