CFNetwork 框架

ci4753 7年前發布 | 31K 次閱讀 Socket iOS開發 移動開發

CFNetwork框架

概述

CFNetwork是一個高性能的低級框架,可以控制一些更底層的東西,如各種常用網絡協議、socket通訊等,實際上除了socket是傳輸層之外,本質上還是應用層上的封裝的通用API。使用者可以不用關心底層協議的實際細節。

 

目前iOS的網絡編程分四層:

  1. WebKit:屬于Cocoa層,蘋果很多地方用到的頁面渲染引擎;
  2. NSURL:也屬于Cocoa層,對各類URL請求的封裝;
  3. CFNetwork:屬于Core Foundation層,基于C的封裝,同樣的還有CFNetServices;
  4. BSD sockets:屬于OS層,也是基于C的封裝;

框架結構

CFNetwork框架包括的類庫如下:

 

可以看到,CFNetwork的基礎是CFSocket和CFStream。

CFSocket API

Socket是網絡通訊的底層基礎,可以讓兩個socket端口互發數據。最常用的socket抽象是BSD socket了。而CFSocket則是BSD socket的抽象,基本上實現了幾乎所有BSD socket的功能,并且還融入了run loop。

CFStream API

CFStream API提供了與設備無關的讀寫數據的方法。使用它可以為內存、文件、網絡(使用socket)的數據建立stream,能使用stream而不必馬上把所有數據都寫入到內存中。

CFStream提供API對兩種CFType對象提供抽象:CFReadStream and CFWriteStream。它同時也是CFHTTP和CFFTP的基礎。

CFFTP API

對用FTP協議通信的封裝,能下載、上傳文件和目錄到FTP服務器。CFFTP建立的連接可以是同步或者異步。

CFHTTP API

是HTTP協議的抽象,用CFHTTP API來創建一個HTTP請求,需要指定以下信息:

  1. 請求方法,如OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、和CONNECT;
  2. 請求的URL地址;
  3. HTTP版本, 如version 1.0或1.1;
  4. 消息頭部,如User-Agent等;
  5. 消息的主體;

一個例子(來源于官方文檔):

// 請求主體內容
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("

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>

其他API

  • CFHTTPAuthentication API
  • CFHost API
  • CFNetDiagnostics API

TODO

  • CFReadStream
  • CFWriteStream

參考資料

 

來自:http://junewong.com/cfnetwork_framework.html

 

 本文由用戶 ci4753 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!