Как запустить бинарный файл Objective-C на веб-сервере?

Хорошо, у меня здесь довольно странный вопрос. Мне гораздо удобнее писать код в Objective-C, чем на любом другом языке. Недавно мне пришлось заняться программированием на стороне сервера, что потребовало от меня изучения PHP. Да, это работает, но ради интереса я хочу добиться того же с помощью Objective-C. Итак, я создал двоичный файл с использованием предустановки Foundation Xcode. Вот большая часть двоичного файла:

#import <Foundation/Foundation.h>
#import "JSONKit.h"

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSString *theURL = [NSString stringWithFormat:@"http://blahblahblah.com/blah"];
    NSError *err = nil;
    NSURLResponse* response = nil;
    NSMutableURLRequest* request = [[[NSMutableURLRequest alloc] init] autorelease];
    NSURL*URL = [NSURL URLWithString:theURL];
    [request setURL:URL];
    [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
    [request setTimeoutInterval:30];
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
    NSDictionary *someData = [data objectFromJSONData];
    NSString *someString = [[someData objectForKey:@"foo"]objectForKey:@"bar"];
    //do something

    [pool drain];
    return 0;
} 

Довольно простой код. Он просто загружает некоторые данные с моего сервера, и я анализирую результат JSON и получаю строку, которую я хочу использовать. Итак, мой вопрос - как я могу запустить это на моем Linux-сервере? Я знаю, что это возможно, возможно, используя GNUStep (или cocotron?), Который я не знаю, как использовать. У кого-нибудь есть идеи?

3 ответа

Решение

Ну, я предлагаю то же самое, что и @lacqui.. Используйте CGI для запуска вашей программы... и вот шаги..

(Примечание: использование CGI не рекомендуется, поскольку он запускает процесс каждый раз, когда на сервер поступает запрос (современные серверы / веб-контейнеры инициируют новый thread (против process ).)

Итак, начнем:

  • Под рукой находится программа, написанная на Objectiv-c
  • Выводом является скрипт CGI (программа или как там его называют), который будет запускаться на каком-то http-сервере.

Во-первых, позвольте мне спросить вас, какова целевая платформа для deploy ваше приложение?

  • Если целевой платформой развертывания является Mac, то вам придется извлечь двоичный код из xcode (я думаю, что он будет в формате.dmg) и найти где-нибудь, как запустить .dmg как CGI-программа внутри веб-сервера (я не уверен, работает ли apache под Mac или нет)

  • Но если это Windows или же Linux:

    1. Вам нужно будет скомпилировать ваше приложение, используя GNUstep (я ничего не знаю о переносимости из Xcode в GNUstep). Вам понадобится GNUstep. Шаги по установке GNUstep для Windows или Linux тривиальны.
    2. После установки GNUstep вам придется снова скомпилировать ваше приложение, используя его, обратитесь к тем же двум ссылкам выше, чтобы узнать, как скомпилировать ваше приложение.
    3. Проблема здесь в том, что AFAIK, GNUstep не полностью поддерживают Objc-2, поэтому вероятность того, что компиляция потерпит неудачу, вызывает использование JSONKit.h в приоритете. Если ваша программа успешно скомпилирована, значит, вы почти закончили.
    4. Предположим, ваша программа компилируется, и теперь у вас есть бинарная программа. Вам нужно будет развернуть ее в некоторых HTTP сервер, который имеет CGI включен. Вы можете следить за моим постом здесь, чтобы узнать, как развернуть бинарную программу, написанную на C, на небольшом http-сервере под названием mini-httpd в Linux (это должно применяться к любой двоичной программе независимо от ее исходного языка).

То, на что вы хотите посмотреть, называется Common Gateway Interface. Это протокол, который определяет способ взаимодействия веб-сервера с подчиненными процессами.

Что произойдет, так это то, что, когда пользователь просматривает URL-адрес, сопоставленный с вашей программой, сервер запустит вашу программу и поместит текст запроса в STDIN. Ваша программа выполнит любую необходимую обработку, а затем поместит результаты (а также некоторую информацию заголовка) в STDOUT.

Что идет не так, когда вы пытаетесь? Вы должны быть в состоянии скомпилировать его с помощью компилятора GCC Objective-C. Вы должны быть в состоянии запустить его.

Другие вопросы по тегам