我正在探索在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