Существует ли в Objective-C механизм, аналогичный Netty в Java, для перенаправления протоколов TCP на UDT на транспортном уровне

Есть ли в Objective-C механизм, похожий на Netty в Java, для перенаправления протоколов TCP на UDT на транспортном уровне.

Теперь я хочу реализовать HTTP-запрос и ответ (по умолчанию работает через TCP) для запуска через UDT из моего приложения.

  1. Это возможно?

  2. Есть ли в iOS встроенный механизм для этого?

2 ответа

Нет ничего более удобного, чем Нетти. Однако вы можете взглянуть на руководство по программированию CFNetwork, в частности, на разделы " Связь с HTTP-серверами". Здесь описываются методы CFHTTPMessage, которые можно использовать для создания и сериализации HTTP-запросов и декодирования ответов. Когда они сериализуются и декодируются из буферов, вы можете свободно передавать сообщения так, как вам нравится. Если у вас уже есть реализация UDT, то она должна быть достаточно простой.

Обратите внимание, что вы несете ответственность за надлежащее кодирование / декодирование тела HTTP, но если ваш протокол веб-службы довольно прост, это может быть только в случае сериализации / десериализации строк.

Если вы хотите использовать HTTP, я предлагаю класс NSURLConnection. Например, чтобы использовать запрос POST с заголовками, сделайте что-то вроде этого:

int kTimeoutInterval = 30;

NSString *post = @"Something to post";
NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding];
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]];


NSString *link = @"http://some_link";
link = [link stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:link] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:kTimeoutInterval];

[request setURL:[NSURL URLWithString:link]];

[request setHTTPMethod:@"POST"];
// set some header entries, for example:
//[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
//[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[postLength length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:postData];

NSError *error;
NSURLResponse* response=nil;
NSData* data=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

Теперь будьте осторожны, это синхронный запрос, и он заблокирует поток, в котором он выполняется, на время выполнения или время ожидания, определенное в константе kTimeoutInterval. Это может быть изменено на асинхронный режим с:

[NSURLConnection connectionWithRequest...

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

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