《ios开发 网络编程http、ftp连接》由会员分享,可在线阅读,更多相关《ios开发 网络编程http、ftp连接(6页珍藏版)》请在金锄头文库上搜索。
1、1.CFHTTP可以使用 CFHTTP API 创建 HTTP 请求,通常 HTTP 请求方法包括GET、HEAD、PUT、POST、DELETE、TRACR、CONNECT 和 OPTIONS。使用 CFHTTP请求一般 4 个步骤: 使用 CFHTTPMessageCreateRequest 函数生成一个 CFHTTP 消息对象使用 CFHTTPMessageSetBody 函数设置消息内容使用 CFHTTPMessageSetHeaderFieldValue 函数设置消息头使用 CFHTTPMessageCopySerializedMessage 序列化消息 只有 http post 需
2、要消息内容,里面是要提交的表单数据。示例:创建一个 http get 请求,序列化后的请求应该通过写入流(write stream)发送。CFStringRef requestHeader = CFSTR(“Connection“);CFStringRef requestHeaderValue = CFSTR(“close“);CFStringRef requestBody = CFSTR(“);CFStringRef url = CFSTR(“http:/ requestMethod = CFSTR(“GET“);CFURLRef requestURL = CFURLCreateWithSt
3、ring(kCFAllocatorDefault, url, NULL);CFHTTPMessageRef request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, requestURL, kCFHTTPVersion1_1);CFHTTPMessageSetBody(request, requestBody);CFHTTPMessageSetHeaderFieldValue(request, requestHeader, requestHeaderValue);CFDataRef serializedRe
4、quest = CFHTTPMessageCopySerializedMessage(request);创建 HTTP 相应的步骤与创建请求的方法差不多,不同之处是用CFHTTPMessageCreateResponse 函数代替 CFHTTPMessageCreateRequest。可以使用一个 CFReadStream 对象来序列化并发送 CFHTTP 请求。当使用CFReadStream 对象时,打开读取流的同时消息会被序列化并发送,这样可以方便地获取响应。如下:CFHTTPMessageRef request = CFHTTPMessageCreateRequest(kCFAlloca
5、torDefault, requestMethod, requestURL, kCFHTTPVersion1_1);CFHTTPMessageSetBody(request, requestBody);CFHTTPMessageSetheaderFieldValue(request, requestHeader, requestHeaderValue);CFReadStreamRef readStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request);CFReadStreamOpen(readStream);调
6、用 CFReadStreamCopyProperty 可以从读取流获取响应消息,代码如下:CFHTTPMessageRef response = CFReadStreamCopyProperty(readStream, kCFStreamPropertyHTTPResponseHeader);使用 CFHTTPMessageCopyResponseStatusLine 函数获得完整的状态行,如下:CFStringRef statusLine = CFHTTPMessageCopyResponseStatusLine(response);或者,使用 CFHTTPMessageGetRespons
7、eStatusCode 函数获取状态码,如下:UInt32 errCode = CFHTTPMessageGetResponseStatusCode(response);为了获取返回的数据,可以使用 CFReadStreamSetClient 方法设置回调函数,将readStream 加到 run loop 中。在回调函数将每次读取的数据存起来(比如,有一个NSMutableData 类型的变量 data),读完后处理数据,代码如下:if(kCFStreamEventHasBytesAvailable = eventType) UInt8 buff255;int length = CFRead
8、StreamRead(stream, buff, 254);data appendBytes:buff length:length; if(kCFStreamEventEndEncountered = eventType) /读取已完成,处理读取的数据 如果接收数据是中文字符串,注意在创建 NSString 时选择编码,比如 UTF8 或 GB2312编码,如下所示:NSString *string = NSString alloc initWithData:data encoding:0x80000632;/GB2312 编码当使用 CFReadStreamCreateForHTTPRequ
9、est 创建读取流时,流的重定向默认是被禁止的。如果请求连接被重定向,会导致一个错误,它的状态码为 300307。如果收到一个重定向错误,需要关闭这个流,然后重新创建一个流,启用重定向并打开流。如下:CFReadStreamRef readStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request);if(CFReadStreamSetProperty(readStream, kCFStreamPropertyHTTPShouldAutoredirect, kCFBooleanTrue) = false)/出错处
10、理 CFReadStreamOpen(myReadStream); 2.CFFTPCFFTP 也使用 CFReadStream 来传送 FTP 数据。使用CFReadStreamCreateWithFTPURL 方法来创建 FTP 请求,这样会同时创建一个CFReadStreamRef 对象来读取 FTP 服务器发送的数据,代码如下:CFStringRef url = CFSTR(“ftp:/ requestURL = CFURLCreateWithString(kCFAllocatorDefault, url, NULL);CFReadStreamRef readStream = CFRea
11、dStreamCreateWithFTPURL(kCFAllocatorDefault, requestURL);下一步,使用 CFReadStreamSetClient 方法设置回调函数来读取数据,然后把readStream 加到程序的 run loop 中。如果 FTP 需要使用用户名和密码认证,通过 CFReadStreamSetProperty 方法设置kCFStreamPropertyFTPUserName 和 kCFStreamPropertyFTPPassword 属性。要将文件下载到本地,可以使用 CFWriteStreamCreateWithFile 方法创建一个指向本地文件
12、的写入流,将接收到的数据写入。上传文件和下载文件差不多,只不过把读取流和写入流反过来用,使用CFWriteStreamCreateWithFTPURL 方法创建写入流,使用CFReadStreamCreateWithFile 创建读取流。创建远程目录的方法与上传文件类似,只不过将 CFURL 对象设置一个路径而不是文件。获取目录列表的方法与下载文件类似,数据读取到缓存后使用CFFTPCreateParsedResourceListing,方法对读取进行解析。3.NSURLConnectionCFNetwork 是比较底层的接口,虽然用起来比较灵活,但并不好用。多数程序仅仅需要创建简单的请求来获
13、取互联网上的一个文件,那么使用 NSURLConnection 要更加方便,因为不用跟套接字、流还有回调函数打交道,取而代之的是更熟悉的委托机制。创建一个 NSURL 对象:NSNRL *url = NSURL URLWithString:“http:/ 对象是用来创建 NSURLRequest 对象的,如下:NSURLRequest *request = NSURLRequest alloc initWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoadtimeoutInterval:60.0;可选的缓存策略有以下几种。(1)N
14、SURLRequestUseProtocolCachePolicy:使用相关协议默认缓存策略。(2)NSURLRequestReloadIgnoringLocalCacheData: 无论本地缓存是什么,请 求都要重新加载数据。(3)NSURLRequestReloadIgnoringLocalAndRemoteCacheData:不仅要忽略本地 缓存,在协议允许的情况下也要忽略远程代理或中间件的缓存。(4)NSURLRequestReturnCacheDataElseLoad:优先使用缓存数据,缓存不存在 时再去加载请求。(5)NSURLRequestReturnCacheDataDontL
15、oad:只加载缓存数据,缓存中不存在 时也不请求,可理解为离线模式。(6)NSURLRequestReloadRevalidatingCacheData: 缓存中的数据没有过期时 才加载缓存中的数据,否则请求数据并刷新缓存。创建完 NSURLRequest 对象后就可以创建 NSURLConnection 对象了,如下:NSURLConnection *connection = NSRULConnection alloc initWithRequest:request delegate:self; 这个是异步调用,NSURLConnection 会在后台发送请求,通过设置委托参数,有数据时会收
16、到通知。由一些委托方法来处理连接是过程中的不同事件。当服务主机有响应将要开始发送数据时,didReceiveResponse:方法会被调用。这里可以做一些初始化的工作,比如有一个 NSMutableData 类型的 data 对象来存储数据,在这里可以把对象长度设为 0,如下所示-(void) connection:(NSURLConnection *)connection didReceiveRespose:(NSURLResonse *)response data setLength:0; 当接收到数据时,didReceiveData:方法会被调用。这里可以把数据加到NSMutableData 对象的后面,如下:- (void)connection:(NSURLConnection *)connection