Какой хороший способ написать интерфейс Cocoa для приложения Erlang?

StackOverflow https://stackoverflow.com/questions/37381

Вопрос

Я изучаю возможность написания приложения на Erlang, но для этого потребуется часть, написанная на Cocoa (предположительно Objective-C).Я бы хотел, чтобы интерфейс и серверная часть могли легко взаимодействовать.Как это лучше всего сделать?

Я могу подумать об использовании портов C и подключенных процессов, но я думаю, что хотел бы обратную ситуацию (запуск интерфейса и подключение к серверной части).Существуют именованные каналы (FIFO), или я мог бы использовать сетевую связь через TCP-порт или именованный сокет BSD.Есть ли у кого-нибудь опыт в этой области?

Это было полезно?

Решение

Одним из способов было бы сделать ядро Erlang приложения демоном, с которым интерфейс Cocoa взаимодействует через сокет домена Unix, используя какой-нибудь простой протокол, который вы разработаете.

Использование сокета домена Unix означает, что демон Erlang может быть запущен по требованию с помощью launchd и интерфейс Cocoa мог бы найти путь к сокету для использования через переменную окружения.Это делает рандеву между приложением и демоном тривиальным, а также упрощает разработку нескольких интерфейсов (или, возможно, фреймворка, который обертывает связь с демоном).

Mac OS X launchd в этом смысле система действительно классная.Если вы укажете, что задание должно запускаться по требованию через защищенный сокет Unix-домена, launchd фактически создаст сам сокет с соответствующими разрешениями и объявит о его местоположении через переменную среды, указанную в списке свойств задания.Задание, при запуске, фактически будет передано файловому дескриптору в сокет с помощью launchd когда он выполняет простую регистрацию.

В конечном счете это означает, что весь процесс внешнего интерфейса открывает сокет для связи с демоном, launchd запуск демона и ответ демона на обмен данными могут быть безопасными, даже если интерфейс и демон выполняются с разными уровнями привилегий.

Другие советы

Один путь - это путь Тео с NSTask, NSPipe и NSFileHandle. Вы можете начать с просмотра кода в CouchDBX http: // couchprojects .googlecode.com / SVN / багажник / неофициальный двоичный-релизы / CouchDBX /

Порты возможны, но совсем не хороши.

Есть ли какая-то причина, по которой это общение не может быть просто обработано общением mochiweb и json?

Обычно при создании приложений Какао, которые запускают команды UNIX или другие безголовые программы, вы используете NSTask :

  

Используя класс NSTask, ваша программа может запускать другую программу в качестве подпроцесса и контролировать ее выполнение. Объект NSTask создает отдельный исполняемый объект; он отличается от NSThread тем, что не разделяет пространство памяти с процессом, который его создает.

     

Задача работает в среде, определяемой текущими значениями для нескольких элементов: текущего каталога, стандартного ввода, стандартного вывода, стандартной ошибки и значений любых переменных среды. По умолчанию объект NSTask наследует свою среду от процесса, который его запускает. Если есть какие-либо значения, которые должны отличаться для задачи, например, если текущий каталог должен измениться, вы должны изменить значение перед запуском задачи. Среду задачи нельзя изменить во время ее выполнения.

Вы можете связаться с внутренним процессом с помощью stdin / stdout / stderr . В основном NSTask - это высокоуровневая оболочка для exec (или fork или system , я всегда забываю разницу) .

Насколько я понимаю, вы не хотите, чтобы программа Erland была фоновым демоном, работающим непрерывно, но если вы это сделаете, используйте предложение @ Chris's .

Подходы к сокетам доменов NSTask и Unix - отличные предложения. Нужно следить за реализацией Erlang FFI, которая находится в разработке:

http://muvara.org/crs4/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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top