将 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
的方式与后端进程通信。基本上NSTask
是exec
的高级包装器(或fork
或system
,我总是忘记区别)。
据我了解,您不希望 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 应用程序的好方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking POST 写入服务器并返回失败错误(Cocoa 错误 3840)