Как запустить бинарный файл Objective-C на веб-сервере? - PullRequest
3 голосов
/ 05 сентября 2011

Хорошо, у меня здесь довольно странный вопрос.Мне гораздо удобнее писать код в 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 ]

3 голосов
/ 16 сентября 2011

Ну, Я предлагаю то же самое, что и @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 (он должен применяться к любой бинарной программе независимо от ее исходного языка).
2 голосов
/ 05 сентября 2011

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

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

1 голос
/ 05 сентября 2011

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

...