Лучший способ сделать межпроцессное взаимодействие в Mac OS X - PullRequest
24 голосов
/ 17 мая 2010

Я смотрю на создание приложения Какао на Mac с внутренним процессом-демоном (возможно, на самом деле это просто приложение Cocoa без головы), наряду с 0 или более «клиентскими» приложениями, работающими локально (хотя, если возможно Я также хотел бы поддерживать удаленных клиентов, так как удаленными клиентами всегда будут другие Mac или устройства с ОС iPhone).

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

Я рассмотрел несколько способов сделать это, но я не уверен, что «лучше» для поставленной задачи. Вещи, которые я рассмотрел:

  • Чтение и запись в файл (… да), очень простой, но не очень масштабируемый.
  • Чистые сокеты (у меня нет опыта работы с сокетами, но мне кажется, что я могу использовать их для отправки данных локально и по сети. Хотя это кажется громоздким, если делать все в Какао
  • Распределенные объекты: кажется довольно не элегантным для такой задачи, как эта
  • NSConnection: Я не могу понять, что вообще делает этот класс, но я читал об этом в некоторых результатах поиска IPC

Я уверен, что есть вещи, которые мне не хватает, но я был удивлен, обнаружив нехватку ресурсов по этой теме.

Ответы [ 3 ]

15 голосов
/ 23 мая 2010

Я сейчас изучаю те же вопросы. Для меня возможность добавления клиентов Windows позже усложняет ситуацию; в вашем случае ответ кажется более простым.

Об опциях, которые вы рассмотрели:

  1. Управляющие файлы: Хотя обмен данными через управляющие файлы возможен, вы должны помнить, что файлы должны передаваться через сетевую файловую систему среди задействованных машин. Таким образом, сетевая файловая система служит абстракцией реальной сетевой инфраструктуры, но не обеспечивает полной мощности и гибкости, которые обычно имеет сеть. Реализация: На практике вам потребуется как минимум два файла для каждой пары клиент / сервер: файл, который сервер использует для отправки запроса клиенту (-ам), и файл для ответов. Если каждый процесс может взаимодействовать в обоих направлениях, вам необходимо продублировать это. Кроме того, как клиент (ы), так и сервер (ы) работают по принципу «извлечения», то есть им необходимо часто пересматривать контрольные файлы и проверять, доставлено ли что-то новое.

    Преимущество этого решения заключается в том, что оно сводит к минимуму необходимость изучения новых методов. Большой недостаток в том, что он предъявляет огромные требования к логике программы; Вы должны позаботиться о многих вещах (Будут ли файлы записаны в виде одного куска или может случиться так, что какая-либо сторона получит несогласованные файлы? Как часто следует проводить проверки? Нужно ли беспокоиться о файловой системе, например, кеширование и т. д. Могу ли я добавить шифрование позже, не разбираясь с вещами вне моего программного кода? ...)

    Если бы переносимость была проблемой (что, насколько я понял из вашего вопроса, не так), тогда это решение было бы легко перенести на разные системы и даже на разные языки программирования. Однако я не знаю никаких сетевых файлов для iPhone OS, но я не знаком с этим.

  2. Сокеты: Интерфейс программирования, безусловно, отличается; в зависимости от вашего опыта программирования сокетов, это может означать, что у вас больше работы, сначала изучая его, а потом отлаживая. Реализация : На практике вам потребуется аналогичная логика, как и раньше, т. Е. Клиент (ы) и сервер (ы), взаимодействующие через сеть. Несомненным плюсом этого подхода является то, что процессы могут работать в режиме «push», то есть они могут прослушивать сокет до тех пор, пока не прибудет сообщение, которое лучше, чем регулярная проверка управляющих файлов. Повреждение сети и несоответствия также не являются вашей заботой. Более того, вы (можете) лучше контролировать способ установления соединений, чем полагаться на вещи, находящиеся вне контроля вашей программы (опять же, это важно, если вы решите добавить шифрование позже).

    Преимущество состоит в том, что с ваших плеч снимается много вещей, которые мешают реализации в 1. Недостатком является то, что вам все еще нужно существенно изменить логику программы, чтобы убедиться, что вы отправляете и получаете правильную информацию (типы файлов и т. д.).

    По моему опыту переносимость (т. Е. Простота перехода на другие системы и даже языки программирования) очень хороша, так как работает все, даже удаленно совместимое с POSIX.

    [ РЕДАКТИРОВАТЬ: В частности, как только вы сообщаете двоичные числа, возникает проблема с бесконечностью, и вы должны решить эту проблему вручную - это распространенный (!) Особый случай «правильного» информационный вопрос, о котором я упоминал выше. Это будет кусать вас, например когда у вас PowerPC разговаривает с Intel Mac. Этот частный случай исчезает с решением 3. + 4. вместе будут решаться все другие проблемы с «правильной информацией».]

  3. + 4. Распределенные объекты: Кластер класса NSProxy используется для реализации распределенных объектов. NSConnection отвечает за настройку удаленных подключений в качестве предварительного условия для отправки информации, поэтому, как только вы поймете, как использовать эту систему, вы также поймете распределенные объекты. ; ^)

    Идея состоит в том, что логику вашей высокоуровневой программы не нужно менять (т. Е. Ваши объекты обмениваются сообщениями и получают результаты, а сообщения вместе с типами возврата идентичны тем, к которым вы привыкли в локальной реализации). ) не беспокоясь об особенностях сетевой инфраструктуры. Ну, по крайней мере, в теории. Реализация: Я тоже сейчас работаю над этим, поэтому мое понимание все еще ограничено. Насколько я понимаю, вам нужно настроить определенную структуру, то есть вам все еще нужно решить, какие процессы (локальные и / или удаленные) могут получать какие сообщения; это то, что NSConnection делает. На этом этапе вы неявно определяете архитектуру клиент / сервер, но вам не нужно беспокоиться о проблемах, упомянутых в 2.

    На сервере проекта Gnustep есть введение с двумя явными примерами; он иллюстрирует, как работает технология, и является хорошей отправной точкой для экспериментов: http://www.gnustep.org/resources/documentation/Developer/Base/ProgrammingManual/manual_7.html

    К сожалению, недостатками являются полная потеря совместимости (хотя вы все равно справитесь с настройкой, которую вы упомянули только для Mac и iPhone / iPad) с другими системами и потеря переносимости на другие языки. Gnustep с Objective-C в лучшем случае совместим с кодом, но нет способа связаться между Gnustep и Cocoa, см. Мое изменение к вопросу № 2 здесь: CORBA в Mac OS X (Какао)

    [ РЕДАКТИРОВАТЬ: Я только что наткнулся на другую информацию, которую я не знал. Хотя я проверил, что NSProxy доступно на iPhone, я не проверял, есть ли другие части механизма распределенных объектов. По этой ссылке: http://www.cocoabuilder.com/archive/cocoa/224358-big-picture-relationships-between-nsconnection-nsinputstream-nsoutputstream-etc.html (поиск на странице по фразе «iPhone OS») они не являются. Это исключило бы это решение, если вы хотите использовать iPhone / iPad в данный момент.]

Итак, в заключение следует отметить, что существует компромисс между усилиями по изучению (и внедрению и отладке) новых технологий, с одной стороны, и ручному кодированию низкоуровневой коммуникационной логики, с другой. В то время как подход с распределенными объектами берет на себя большую нагрузку на ваши плечи и влечет за собой наименьшие изменения в логике программы, он труднее всего изучать, а также (к сожалению) наименее переносим.

13 голосов
/ 17 мая 2010

Отказ от ответственности: Распределенные объекты недоступны на iPhone .


Почему вы находите распределенных объектов не элегантными? Они звучат как хороший матч здесь:

  • прозрачное распределение основных типов и классов Objective-C
  • не имеет значения, являются ли клиенты локальными или удаленными
  • не так много дополнительной работы для приложений на основе какао

Документация может показаться, что это больше похоже на работу, чем на самом деле, но все, что вам в основном нужно сделать - это аккуратно использовать протоколы и экспортировать или соответственно подключаться к корневому объекту сервера. Остальное должно произойти автоматически за кулисами для вас в данном сценарии.

6 голосов
/ 26 мая 2010

Мы используем ThoMoNetworking , он отлично работает и быстро настраивается. В основном это позволяет отправлять объекты, совместимые с NSCoding, в локальной сети, но, конечно, также работает, если клиент и сервер находятся на одной машине. Как оболочка для базовых классов, она заботится о сопряжении, переподключениях и т. Д.

...