У меня проблема. Я прочитал много тем на stackoverflow об этой проблеме, но ничего не помогло.
Я пытаюсь реализовать клиент-серверную связь через кометное соединение. У меня есть экземпляр, который отвечает за отправку сообщений и экземпляр, который отвечает за получение сообщений.
Процесс следующий:
— Отправить экземпляр отправляет запрос GET на сервер, сервер отвечает на получение экземпляра.
Первый вызов работает нормально, я получаю первый ответ и могу получить данные, которые мне нужны, но следующий запрос не вызывает моего обратного вызова didReceiveData для запуска. Но я вижу, что сервер отправил данные, я вижу их в журналах сервера и вижу их в wireshark на клиентской машине. Интересная вещь: первый ответ не вызывал моего обратного вызова до того, как я добавил «content-length: 0» в ответ. Недокументированная особенность NSUrlConnection? Что еще я должен рассмотреть, чтобы NSUrlConnection думал, что ответ действителен?
Альтернатива: принудительно извлекать данные из сокета, но я не знаю, возможно ли это с помощью NSUrlConnection (человек отключен)
постоянный код подключения:
NSURL* requestUrl = [NSURL URLWithString:[[NSString alloc] initWithUTF8String:rq->url.c_str()]];
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:requestUrl cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:600];
m->connection = [[NSURLConnection alloc] initWithRequest:request delegate:request_delegate() startImmediately:NO];
[m->connection scheduleInRunLoop:[NSRunLoop mainRunLoop]
forMode:NSDefaultRunLoopMode];
[m->connection start];
Сервер nginx должен установить в разделе заголовка «content-length» что-то большое, потому что клиент получает пакеты и увеличивает количество полученных байтов, а после получения количества байтов, установленных в заголовке — больше не будет отвечать. Пропуск раздела длины контента будет блокировать вызовы делегатов. Это было причиной
Других решений пока нет …