我想通过Apple CFNetwork框架使用持久HTTP连接来减少我们的服务器开销。但是关于它的文档很少。我能找到的建议框架回收的唯一信息,只要适当的标志设置代表开发商的流:CFNetwork持久连接(保持活力)
CFHTTPMessageRef request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, methodString, url, kCFHTTPVersion1_1);
CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Keep-Alive"), CFSTR("120")); <--- This line
//Set message body if we're posting
if (msDetails.eType == HttpRequestDetails::POST)
{
CFDataRef bodyRef = CFDataCreate(kCFAllocatorDefault, (const UInt8*)msDetails.strBody.c_str(), msDetails.strBody.length());
CFHTTPMessageSetBody(request, bodyRef);
CFRelease(bodyRef);
}
//Create the read stream...
CFReadStreamRef ReadStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request);
//...use persistent connections..
CFReadStreamSetProperty(ReadStream, kCFStreamPropertyHTTPAttemptPersistentConnection, kCFBooleanTrue); <--- This line
//...enable SSL if the URL is https
if(msDetails.strURL[4] == 's')
{
//Hey an https request
CFMutableDictionaryRef pDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(pDict, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse);
CFDictionarySetValue(pDict, kCFStreamPropertySocketSecurityLevel, kCFStreamSocketSecurityLevelSSLv3);
CFReadStreamSetProperty(ReadStream, kCFStreamPropertySSLSettings, pDict);
CFRelease(pDict);
}
CFReadStreamOpen(ReadStream);
上面的代码会导致“CFNetwork的内部错误”。如果我删除CFReadStreamSetProperty(ReadStream,kCFStreamPropertyHTTPAttemptPersistentConnection,kCFBooleanTrue)调用,那么我不会再收到错误。还值得一提的是,一旦我读完数据后关闭了阅读流,但也许我需要自己管理流池?
有没有人有任何文件,例子或教程,他们可以引荐我?我很想继续使用CFNetwork,因为我们有一个客户坚持我们必须尽量减少使用Obj-C。
我发现了更多关于这个问题的信息。显然,CFNetwork将在开放式流通话中重新使用开放式连接。如果没有开放的连接,那么它将打开一个新的连接(有意义)。如果你想持久连接,你必须打开它们。这意味着您必须决定在打开一个新的流(它将重新使用现有的连接)之前,当前是否有连接打开到域,然后关闭旧的流。 – Downie 2011-10-24 13:45:19