CFNetwork 框架
<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>
本文由用户 ci4753 自行上传分享,仅供网友学习交流。所有权归原作者,若您的权利被侵害,请联系管理员。
转载本站原创文章,请注明出处,并保留原始链接、图片水印。
本站是一个以用户分享为主的开源技术平台,欢迎各类分享!