iOS网络编程
检测网络状态
- 检查网络状态。
1>下载和添加Reachablity类.
2>为项目添加SystemConfiguration.framework框架。
若要手动禁用ARC源文件,输入框添加“-fno-objc-arc”.
使用CFNetwork实现TCP协议的通信
CFNetwork对基于TCP协议的网络通信提供了良好的封装,CFNetwork使用CFSocket来代表两端的通信端口,还可以通过CFStream读/写数据。
IP地址是32位整数,分为A,B,C,D,E五类。用于唯一标识网络上的一个通信实体
A类:10.0.0.0~10.255.255.255
B类:172.16.0.0~172.31.255.255
C类:192.168.0.0~192.168.255.255端口是16为整数,表示数据交给哪个通信程序处理,是应用程序和外界交流的出入口,包括一些数据结构和I/O。
公认端口:从0到1023,紧紧绑定一些特定的服务。
注册端口:从1024到49151,松散的绑定一些服务,适用于应用程序。
动态和/私有端口:从49152到65535.使用CFSocket实现TCP服务器端
步骤:
1>创建一个监听Socket Accept的CFSocket,并为kCFSocketAcceptCallBack事件绑定回调函数。
2>调用CFSocketSetAddress()函数,将服务器的CFSocket绑定到本地IP地址和端口。
3>将CFSocket作为source添加到指定线程的CFRunLoop上,并运行该线程的CFRunLoop,从而保证该CFSocket能持续不断的接受来自客户端的连接。使用CFSocket实现TCP客户端
步骤:
1>创建一个不监听任何事件或监听Connection的CFSocket。如果要监听Connection,则需要为kCFSocketConnectCallBack事件绑定回调函数。
2>调用CFSocketConnectionToAddress()函数,将客户端的CFSocket;连接到指定IP地址和端口的服务器上。
3>得到客户端CFSocket之后,既可直接使用CFSocketNativeHandle进行读/写,也可通过CFSocket获取CFReadStreamRef、CFWriteStreamRef后进行读、写。使用CocoaAsyncSocket实现TCP客户端
降低直接使用CFSocket编程的复杂度,另外有开发者提供了一套开源的CocoaAsyncSocket库。
CocoaAsyncSocket封装了CFNetwork底层的CFSocket和CFStream,并提供了异步操作,支持TCP和UDP。
特性:- 非阻塞方式的读和写,而且可设置超时时长。
- 自动的socket接受,如果调用它接受连接,它将为每个连接启动新的实例,当然也可以立即关闭这些连接。
- 委托支持,错误、连接、接收、完整的读取、完整的写入、进度以及断开连接,都可通过代理模式调用。
- 所有操作都封装在一个类中,开发者无需操作socket或流,该类封装了所有操作。
使用NSURLConnection
- 使用NSURLConnection从网络获取数据
方法:- (NSURLRequest *)originalRequest://获取该NSURLConnection最初的NSURLRequest对象的深拷贝
- (NSURLRequest *)currentRequest://返回该该NSURLConnection当前使用的NSURLRequest对象。
1>同步请求获取网络数据:+ sendSynchronousRequest:returningResponse:error:
2>异步请求获取网络数据:
总指定一个NSURLConnectionDelegate对象,将该对象作为NSURLConnection的delegate,负责服务器响应到来的各种事件。+ connectionWithRequest:delegate://异步请求的方式获取数据
- initWithRequest:delegate//实例方法,必须先调用alloc,再调用该方法。
+ sendAsynchronousRequest:queue:CompletionHandler://表明将请求交给指定的NSOperationQueue处理
- start://开始发送请求
使用使用NSURLConnection从网络获取数据的步骤:
1>创建NSURLRequest对象,该对象代表对远程服务器的请求。包括:请求的URL,缓存策略,超时时长等。
2>调用NSURLConnection的实例方法或类方法,以NSURLRequest对象为参数创建NSURLConnection即可发送请求。
3>以异步方式加载服务器响应,则需要为NSURLConnection对象指定delegate对象,因此还需要为delegate对象实现特定的方法。使用NSMutableURLRequest向服务器发送请求
NSURLRequest只能想服务器发送简单的请求,不能添加请求头和请求参数,使用NSMutableURLRequest可以。-addValue:forHTTPHeaderField:为使用NSMutableURLRequest添加请求头。
-setAllHTTPHeaderField:通过一个NSDictionary一次性为NSMutableURLRequest设置多个请求头。
-setHTTPBody:设置NSMutableURLRequest的请求参数
-setHTTPBodyStream:以NSInputStream为参数设置NSMutableURLRequest的请求参数
-setHTTPMethod:设置提交请求方式,要么是POST,要么是GET。
-setHTTPShouldHandleCookies:设置该HTTP请求是否处理Cookie。
-setValue:forHTTPHeaderField:为指定的请求头设置请求值。
XML解析
- DOM与SAX
DOM:Document Object Model。文档对象模型、
SAX:Simple API for XML。
iOS SDK提供了NSXMLParser和libxml2两个类库,还有第三方库GDataXML,TBXML,TouchXML,KissXML等。
需要读取和修改XML文档,使用GDataXML,KissXML。
需要读取非常大的XML文档,使用libxml2或TBXML。 - NSXMLParser解析XML文档
步骤:- 创建NSXMLParser对象。
- 为NSXMLParser对象指定delegate对象,该delegate对象必须实现NSXMLParserDelegate协议,并根据需要实现协议中特定的方法。
- 调用NSXMLParser对象的parse方法开始解析。
- libxml2解析XML文档
使用C语言的库,准备步骤:- 为项目添加libxml2.dylib库
- 添加头文件的搜索路径
步骤: - 创建XMLTextReaderPtr对象.如果以本地XML文档来创建XMLTextReaderPtr对象,则调用XMLTextReaderFilename()函数即可。如果以内存中XML文档来创建该对象,则调用XMLReaderForMemeory()函数即可。
- 依次调用XMLTextReaderxxx()函数来读取XML文档的元素名,元素值,属性等各种内容。
- GDataXML解析XML文档
第三方开源库,对libxml2的宝座,底层依赖libxml2,既支持解析XML文档 ,也支持修改XML文档,支持XPath方式查询,提供了更好的面向对象的封装。
准备步骤:
步骤:
- 调用GDataXMLDocument的初始化方法根据XML文档或XML字符初始化GDataXMLDocument对象。(GDataXMLDocument对象就是XML文档转换得到的DOM树)
- 调用GDataXMLDocument对象的rootElement方法即可获取该文档的根元素
- 获取根元素后,就可以根据XML元素之间的父子关系来逐层遍历,访问该XML文档中的每一个元素,从而获取XML元素的内容。
- GDataXML生成XML文档
- 调用GDataXMLNode的elementWithName:方法创建 GDataXMLelement对象,并以该对象作为XML文档的根元素。
- 调用GDataXMLNode的elementWithName:方法不断创建 GDataXMLelement对象(XML元素),并利用元素之间的父子关系组织这些XML元素。
- 调用GDataXMLDocument对象的XMLData方法获取XML文档对应的NSData对象,调用NSData的输出方法将XML文档输出到指定文件或其他存储介质。
- GDataXML修改XML文档
- 调用GDataXMLDocument方法根据指定的XML文档或者XML字符串来生成对应的GDataXMLDocument对象–它代表了XML文档在内存中的形式。
- 获取GDataXMLDocument对象的根元素,然后利用元素之间父子关系添加子元素、删除子元素或修改元素的内容。
- 调用GDataXMLDocument对象的XMLdata的方法获取XML文档对应的NSData 对象,调用NSdata的输出方法将XML文档输出到指定文件或其他存储介质。
- 调用GDataXMLDocument对象的XMLdata的方法获取XML文档对的NSData对象,调用NSData的输出方法将XML文档输出到指定文件或其他存储介质
JSON解析
JSON具有跨平台,跨语言的优势。两种数据结构:
- 由key-value对组成的数据结构。
- 有序集合
- 使用JSON语法创建对象
直接创建一个JavaScript对象, - 使用JSON语法创建数组
var a = ['yeeku','nono'];
- 使用NSJSONSerialization处理JSON数据 (系统自带)
满足条件:
顶级对象只能是NSArray或NSDictionary。
集合中包含对象只能是NSString,NSNumber,NSArray,NSDictionary或NSNull对象。
所有NSDictionary的key只能是NSString。
NSNumber保证的数值不是NaN或Infinity。 - 使用SBJson解析JSON数据
提供了两个工具类:SBJsonParser和SBJsonWriter.
SBJsonParser负责吧NSData或NSString形式的JSON数据转换为objective-c对象。
SBJSonWriter负责把objective-c对象转换为NSData或NSString形式的JSON数据。 - 第三方类库解析JSON, 使用JSONKit解析JSON数据
地址:https://github.com/johnezang/JSONKit
JSONKit速度快,JsonKit1.4不支持ARC,需要在支持ARC的项目中设置‘fno-objc-arc’选项来禁用ARC。
JSONKit采用分类方式为已有的类增加了新方法。用于将JSON数据恢复为objective-c对象。
研究一下第三方框架就可以发现:
JSONKit用分类为NSString和NSDate增加了如下方法,
把JSON数据转换为OC对象:
1 | - (id)objectFromJSONString; |
JSONKit用分类为NSString、NSStringArray和NSDictionary增加了如下方法:将OC对象装潢为NSString和NSData形式的JSON数据。
1 | - (NSData *)JSONData; |
使用AFNetworking实现网络通信
只是需要向web某个站点的某个简单页面提交请求并获取服务器响应,则使用NSURLConnection来完成。为了更好的处理web站点请求,包括处理Session,Cookie,可以用AFNetworking,用于发送HTTP请求,接受HTTP响应。但不会缓存服务器响应,不能执行HTML页面中嵌入的JavaScript代码,也不会对页面内容进行任何解析处理。AFNetworking还支持JSON、Plist属性文件和XML解析。
提交GET请求与提交POST请求
步骤:- 创建AFHTTRequestOperationManager对象。
- 根据服务器响应内容不同,为HTTORequestOperationManager对象指定不同的解析器。(JSON或Plist数据)
- 如果需要发送GET请求,调用AFHTTRequestOperationManager对象的GET:parameters:success:failure:方法即可 。
- 如果要发送POST请求,调用AFHTTRequestOperationManager对象的POST:parameters:success:failure:方法即可 。
- 在success:参数指定的代码块中处理服务器响应成功的正确数据。
处理JSON和Plist响应
可以直接将JSON和Plist转化为NSArray或NSDictionary对象。 AFHTTORequestOperationManager默认可以处理JSON或Plist对象。处理XML响应
为AFHTTORequestOperationManager显示使用
AFXMLParserResponseSerializer响应解析器,当使用AFXMLParserResponseSerializer解析器时,服务器返回的数据是一个NSXMLParser对象。上传文件
AFHTTRequestOperationManager对象的POST: parameters:constructingBodyWithBlock:success:failure:方法提交POST请求即可,多了三个参数,一个是带AFMultipartFormData形参的代码块。
使用ASIHTTPRequest框架实现网络编程
- 发送同步或异步的GET请求
准备步骤:
目前不支持ARC,应该需要在支持ARC的项目中设置‘fno-objc-arc’选项来禁用ARC。
步骤:
- 使用代码块
ASIHTTPRequest发送异步请求,即可使用delegate为ASIHTTPRequest设置回调处理代码,也可用代码块来设置回调处理代码。-setCompletionBlock:设置发送请求、获取服务器响应完成时激发的代码块。
`-setFailedBlock:获取发送请求失败时激发的代码块。