原文地址:developer
CFNetwork概念
CFNetwork是一个低级的、高性能的框架,使您能够详细的控制协议栈。BSD套接字是一个扩展,提供对象的标准套接字抽象API来简化任务,比如与FTP和HTTP服务器或沟通解决DNS主机。CFNetwork为基础,从主体上和理论上,BSD套接字。
正如CFNetwork依赖于BSD套接字,有大量的Cocoa类依赖CFNetwork(例如,NSURL)。此外,Web工具包是一组Cocoa类在窗口中显示网页内容。这两个类是非常高的水平,实现大部分的网络协议的细节。因此,软件层的结构看起来像图像如图1 - 1所示。
图1 - 1在OS X CFNetwork和其他软件层
何时使用CFNetwork
CFNetwork在BSD套接字有许多优点。它提供run-loop集成,因此,如果您的应用程序是基于运行循环可以使用网络协议没有实现线程。CFNetwork还包含大量的对象来帮助你使用网络协议,而无需自己实现细节。例如,您可以使用FTP协议无需CFFTP API实现的所有细节。如果你理解网络协议,需要他们提供的低级控制但不想实现自己,然后CFNetwork可能是正确的选择。
有许多优势,使用CFNetwork代替基础水平网络api。CFNetwork更侧重于网络协议,而基础水平更侧重于数据访问api,比如通过HTTP或FTP传输数据。虽然基础api提供了一些可配置性,CFNetwork提供更多。基础网络课程的更多信息,阅读URL Loading System Programming 指南.
现在开始了解CFNetwork交互与其他OS X网络api,准备熟悉CFNetwork api以及两个api,形成CFNetwork的基础设施。
CFNetwork基础设施
在学习CFNetwork api之前,你必须首先理解的api大多数CFNetwork的基础。CFNetwork依赖两个api的核心基础框架的一部分,CFSocket CFStream。理解这些api使用CFNetwork至关重要。
CFSocket API
套接字是最基本的网络通信。一个套接字以类似电话的方式。它允许您连接到另一个套接字(本地或通过网络)和套接字发送数据。
最常见的套接字抽象是BSD套接字。CFSocket是一个抽象的BSD套接字。非常小的开销,CFSocket BSD套接字提供了几乎所有的功能,并集成了套接字变成一个循环运行。CFSocket并不局限于基于流套接字(例如TCP),它可以处理任何类型的套接字。
你可以从头创建一个CFSocket对象使用CFSocketCreate函数,或从一个BSD套接字使用CFSocketCreateWithNative函数。然后,您可以使用该函数创建一个run-loop源CFSocketCreateRunLoopSource并将它添加到CFRunLoopAddSource运行循环的功能。这将允许你CFSocket回调函数运行时CFSocket对象接收一条消息。
读CFSocket参考有关CFSocket API的更多信息。
CFStream API
读写流提供一种简单的方法来交换数据和从各种媒体方式与设备无关。您可以创建流数据位于内存中,在一个文件中,或者在一个网络(使用套接字),你可以使用数据流,而不必将所有数据加载到内存中去。
流是一个字节序列传输串行通信路径。流是单向路径,所以双向沟通的一个输入(阅读)流和输出(写)流是必要的。除了基于文件流,你不能寻求在一个流;一旦流数据被提供或消费,又无法获取它的流
CFStream是一个API,它提供了一个抽象为这些流有两个新的CFType对象:CFReadStream CFWriteStream。这两种类型的流API规范遵循所有常见的核心基础。关于核心基础类型的更多信息,阅读Core Foundation Design Concepts。
CFStream是建立在CFSocket,CFHTTP和CFFTP的基础。如图1 - 2中可以看出,尽管CFStream不是正式CFNetwork的一部分,它是几乎所有CFNetwork的基础
Figure 1-2 CFStream API structure
您可以使用读写流一样像你UNIX文件描述符。首先,您通过指定实例化流的流型(内存、文件或套接字)和设置任何选项。接下来,您打开流和读或写任何的次数。而流存在,你可以要求其属性的流信息。流属性是任何关于流的信息,比如它的源或目标,不是实际数据被读取或写入的一部分。当你不再需要流,关闭并处理它。
CFStream读或写的函数流将暂停,或块,当前进程,直到至少有一个数据可以读取或写入的字节。为了避免试图读取或写入一个流流将阻止时,使用异步版本的功能和进度上的流循环运行。你的回调函数被调用时可能没有阻塞读和写。
此外,CFStream内置支持安全套接字层(SSL)协议。您可以设置一个字典包含流的SSL信息,如所需的安全级别或自签名证书。然后将它传递给你的流kCFStreamPropertySSLSettings制造SSL流。
本章使用流描述如何使用读写流。
CFNetwork API概念
要理解CFNetwork框架,您需要熟悉的构建块组成。CFNetwork框架分解成单独的api,每个覆盖特定的网络协议。这些api可用于组合,或分开,这取决于您的应用程序。大多数的编程约定api中是常见的,因此,重要的是理解。
CFFTP API
沟通与CFFTP FTP服务器变得更加容易。使用CFFTP API,您可以创建FTP读流(下载)和FTP写流(上传)。使用FTP读写流可以执行等功能。
从一个FTP服务器下载一个文件
上传文件到FTP服务器上
从一个FTP服务器下载目录清单
在FTP服务器上创建目录
FTP流就像所有其他CFNetwork流。例如,您可以创建一个FTP读取流CFReadStreamCreateWithFTPURL函数通过调用函数。然后,您可以调用该函数CFReadStreamGetError随时检查流的状态。
通过设置FTP流上的属性时,您可以调整您为其特定的应用程序流。例如,如果流的服务器连接到需要用户名和密码,您需要设置适当的属性所以流可以正常工作。关于不同属性的更多信息可看Setting up the Streams.。、
CFFTP流可以使用同步或异步。打开连接的FTP服务器创建时指定FTP读取流,CFReadStreamOpen调用的函数。从流读取,使用CFReadStreamRead函数并提供读取流参考,CFReadStreamRef,返回FTP读取流时创建的。CFReadStreamRead函数填充和FTP服务器的输出缓冲区。
使用CFFTP更多信息,请看 Working with FTP Servers。
CFHTTP API
发送和接收HTTP消息,使用CFHTTP API。正如CFFTP是一个抽象的FTP协议,CFHTTP是HTTP协议的一个抽象。
超文本传输协议(HTTP)请求/响应协议客户端和服务器之间。客户端创建一个请求消息。这个消息被序列化,这一过程将消息转换为原始字节流。消息不能传播,直到他们被序列化。然后请求消息发送到服务器。请求通常要求一个文件,如网页。服务器响应发送回一个字符串消息紧随其后。这个过程重复多次是必要的。
要创建一个HTTP请求消息,您指定以下:
请求方法,可以请求方法定义的超文本传输协议,如GET, HEAD, POST, PUT, DELETE, TRACE,和CONNECT
URL,如http://www.apple.com
他HTTP版本,比如版本1.0或1.1
消息的标题,通过指定的标题名称,如User-Agent,和它的value,如MyUserAgent
消息的主体
消息后,你序列化。请求序列化后,看起来像这样:
GET / HTTP/1.0\r\nUser-Agent: UserAgent\r\nContent-Length: 0\r\n\r\n
反序列化是序列化的反面。反序列化,从客户机或服务器接收到的原始字节流恢复其原生的表示。CFNetwork提供所有功能需要得到消息类型(请求或响应)、HTTP版本,URL,标题,和传输流,序列化消息。
更多的例子在Communicating with HTTP Servers。
CFHTTPAuthentication API
如果你发送一个HTTP请求身份验证服务器没有凭证(或用不正确的凭证),服务器将返回一个授权的要求(俗称401或407响应)。CFHTTPAuthentication API HTTP消息身份验证凭证适用于一些要求。CFHTTPAuthentication支持以下身份验证方案:
Basic
Digest
NT LAN Manager (NTLM)
Simple and Protected GSS-API Negotiation Mechanism (SPNEGO)
新的在OS X v10.4上携带持久性跨域请求的能力。在OS X v10.3每次请求受到要求,你必须从头开始身份验证对话框。现在,你为每个服务器维护一组CFHTTPAuthentication对象。当你收到一个401或407响应,您找到正确的对象和凭证的服务器和应用它们。CFNetwork使用信息存储在对象尽可能高效地处理请求。
通过持续在请求时,这个新版本的CFHTTPAuthentication提供更好的性能。更多的信息关于如何使用CFHTTPAuthentication请看Communicating with Authenticating HTTP Servers。、
CFHost API
你使用CFHost API获取主机信息,包括名字,地址,和可达性信息。获取信息的过程称为resolution。
使用CFHost 就像CFStream一样:
创建一个CFHost对象
开始解决CFHost对象。
检索的地址、主机名、或可达性信息
当你完成的时候摧毁CFHost对象。
像所有CFNetwork CFHost IPv4和IPv6是兼容的。使用CFHost,您可以编写代码来处理IPv4和IPv6。
CFHost集成与CFNetwork的其余部分。例如,有CFStream名为CFStreamCreatePairWithSocketToCFHost的函数将直接从CFHost创建一个CFStream对象。关于CFHost对象功能的更多信息,看CFHost Reference。
CFNetServices API
如果你想让你的应用程序使用Bonjour注册一个服务或发现服务,使用CFNetServices API。Bonjour是苹果的zero配置网络的实现(ZEROCONF),它允许您发布、发现和解决网络服务。
实现你好CFNetServices API定义了三个对象类型:CFNetService CFNetServiceBrowser,CFNetServiceMonitor。CFNetService对象代表一个单一的网络服务,如打印机或文件服务器上。它包含所有所需的信息对于服务器的另一台计算机来解决,如名称、类型、域和端口号。CFNetServiceBrowser对象被用来发现领域内域和网络服务。和CFNetServiceMonitor对象用于监视CFNetService对象的变化,如iChat状态消息。
Bonjour完整的描述,请参阅Bonjour Overview.。关于使用CFNetServices的更多信息和实现Bonjour,请看NSNetServices and CFNetServices Programming Guide.
CFNetDiagnostics API--网络诊断
连接到网络的应用程序依赖于一个稳定的连接。如果网络出现故障,这将导致应用程序的问题。采用CFNetDiagnostics API,用户可以自诊断网络问题如:
物理连接失败(例如,电缆未插入)
网络故障(例如,DNS、DHCP服务器不再回应)
配置失败(例如,代理配置是不正确的)
一旦网络故障诊断,CFNetDiagnostics指导用户解决问题。你可能看过CFNetDiagnostics行动如果Safari未能连接到一个网站。CFNetDiagnostics助理可以看到如图1 - 3所示。
通过提供CFNetDiagnostics网络故障的上下文中,您可以调用CFNetDiagnosticDiagnoseProblemInteractively函数引导用户通过提示找到解决的办法。此外,您可以使用CFNetDiagnostics查询连接状态和为用户提供统一的错误消息。
看到如何将CFNetDiagnotics集成到您的应用程序请看Using Network Diagnostics。CFNetDiagnostics为OS X v10.4新的API。
版权声明:本文为博主原创文章,未经博主允许不得转载。
iOS CFNetwork Concepts CFNetwork概念 官方文档翻译(三)
原文地址:http://blog.csdn.net/wq820203420/article/details/48084995