将 Cocoa 前端写入 Erlang 应用程序的好方法是啥?

Posted

技术标签:

【中文标题】将 Cocoa 前端写入 Erlang 应用程序的好方法是啥?【英文标题】:What's a good way to write a Cocoa front-end to an Erlang application?将 Cocoa 前端写入 Erlang 应用程序的好方法是什么? 【发布时间】:2010-09-07 10:24:11 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

Mac OS X launchd 系统采用这种方式真的很酷。如果您指定作业应通过安全的 Unix 域套接字按需启动,launchd 实际上将创建具有适当权限的套接字本身,并通过作业属性列表中命名的环境变量公布其位置。该作业在启动时实际上会在进行简单签入时由launchd 将文件描述符传递给套接字。

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

【讨论】:

不幸的是,这些天发布的文档严重不足。 我通常发现launchd 手册页很有用。如果您对此有任何疑问,最好在 Stack Overflow 上提问。【参考方案2】:

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

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

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

您可以通过stdin/stdout/stderr的方式与后端进程通信。基本上NSTaskexec 的高级包装器(或forksystem,我总是忘记区别)。

据我了解,您不希望 Erland 程序成为连续运行的后台守护程序,但如果您这样做,请使用 @Chris's 建议。

【讨论】:

【参考方案3】:

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

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

为什么这种通信不能简单地用 mochiweb 和 json 通信处理?

【讨论】:

【参考方案4】:

NSTask 和 Unix 域套接字方法都是很好的建议。需要关注的是正在开发中的 Erlang FFI 实现:

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

使用 NSTask 你也可以考虑使用PseudoTTY.app(允许交互式通信)!

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

open -a Safari http://web.archive.org/web/20080324145441/http://www.bignerdranch.com/applications.shtml

【讨论】:

以上是关于将 Cocoa 前端写入 Erlang 应用程序的好方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何允许用户将文件拖出 Cocoa 应用程序

AFNetworking POST 写入服务器并返回失败错误(Cocoa 错误 3840)

Objective C - 创建文本文件以在 Cocoa 中逐行读取和写入

将文件名与文件扩展名 Cocoa 分开?

通过 REST 访问 Erlang 业务层

在 Elixir/Erlang 中的(本地)Mnesia 实例上实现最佳写入性能