CFNetwork 框架

ci4753 7年前
   <h2>CFNetwork框架</h2>    <h2>概述</h2>    <p>CFNetwork是一个高性能的低级框架,可以控制一些更底层的东西,如各种常用网络协议、socket通讯等,实际上除了socket是传输层之外,本质上还是应用层上的封装的通用API。使用者可以不用关心底层协议的实际细节。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/aa49a9961470bc1613277d57ef5c9a3a.png"> </p>    <p>目前iOS的网络编程分四层:</p>    <ol>     <li>WebKit:属于Cocoa层,苹果很多地方用到的页面渲染引擎;</li>     <li>NSURL:也属于Cocoa层,对各类URL请求的封装;</li>     <li>CFNetwork:属于Core Foundation层,基于C的封装,同样的还有CFNetServices;</li>     <li>BSD sockets:属于OS层,也是基于C的封装;</li>    </ol>    <h2>框架结构</h2>    <p>CFNetwork框架包括的类库如下:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/dd5225c7354863c48958a8ef716cbd84.png"> </p>    <p>可以看到,CFNetwork的基础是CFSocket和CFStream。</p>    <h3>CFSocket API</h3>    <p>Socket是网络通讯的底层基础,可以让两个socket端口互发数据。最常用的socket抽象是BSD socket了。而CFSocket则是BSD socket的抽象,基本上实现了几乎所有BSD socket的功能,并且还融入了run loop。</p>    <h3>CFStream API</h3>    <p>CFStream API提供了与设备无关的读写数据的方法。使用它可以为内存、文件、网络(使用socket)的数据建立stream,能使用stream而不必马上把所有数据都写入到内存中。</p>    <p>CFStream提供API对两种CFType对象提供抽象:CFReadStream and CFWriteStream。它同时也是CFHTTP和CFFTP的基础。</p>    <h3>CFFTP API</h3>    <p>对用FTP协议通信的封装,能下载、上传文件和目录到FTP服务器。CFFTP建立的连接可以是同步或者异步。</p>    <h3>CFHTTP API</h3>    <p>是HTTP协议的抽象,用CFHTTP API来创建一个HTTP请求,需要指定以下信息:</p>    <ol>     <li>请求方法,如OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、和CONNECT;</li>     <li>请求的URL地址;</li>     <li>HTTP版本, 如version 1.0或1.1;</li>     <li>消息头部,如User-Agent等;</li>     <li>消息的主体;</li>    </ol>    <p>一个例子(来源于官方文档):</p>    <pre>  <code class="language-objectivec">// 请求主体内容  CFStringRef bodyString = CFSTR(""); // Usually used for POST data  CFDataRef bodyData = CFStringCreateExternalRepresentation(kCFAllocatorDefault,                                          bodyString, kCFStringEncodingUTF8, 0);     // http头内容  CFStringRef headerFieldName = CFSTR("X-My-Favorite-Field");  CFStringRef headerFieldValue = CFSTR("Dreams");     // url地址  CFStringRef url = CFSTR("http://www.apple.com");  CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, url, NULL);     CFStringRef requestMethod = CFSTR("GET");  CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, myURL, kCFHTTPVersion1_1);     CFDataRef bodyDataExt = CFStringCreateExternalRepresentation(kCFAllocatorDefault, bodyData, kCFStringEncodingUTF8, 0);  // 设置好主体内容  CFHTTPMessageSetBody(myRequest, bodyDataExt);  // 设置http头信息  CFHTTPMessageSetHeaderFieldValue(myRequest, headerFieldName, headerFieldValue);  // 序列化请求  CFDataRef mySerializedRequest = CFHTTPMessageCopySerializedMessage(myRequest);</code></pre>    <h3>其他API</h3>    <ul>     <li>CFHTTPAuthentication API</li>     <li>CFHost API</li>     <li>CFNetDiagnostics API</li>    </ul>    <h2>TODO</h2>    <ul>     <li>CFReadStream</li>     <li>CFWriteStream</li>    </ul>    <h2>参考资料</h2>    <ul>     <li><a href="/misc/goto?guid=4959740817219177345" rel="nofollow,noindex">Introduction to CFNetwork Programming Guide</a> :官方文档</li>     <li><a href="/misc/goto?guid=4959740817306102872" rel="nofollow,noindex">Working with Streams</a></li>     <li><a href="/misc/goto?guid=4959740817394441597" rel="nofollow,noindex">iOS网络编程之CFNetwork</a></li>    </ul>    <p> </p>    <p>来自:http://junewong.com/cfnetwork_framework.html</p>    <p> </p>