iOS网络编程

iOS网络编程知识总结

iOS网络编程

检测网络状态

  1. 检查网络状态。
    1>下载和添加Reachablity类.
    2>为项目添加SystemConfiguration.framework框架。
    若要手动禁用ARC源文件,输入框添加“-fno-objc-arc”.

使用CFNetwork实现TCP协议的通信

CFNetwork对基于TCP协议的网络通信提供了良好的封装,CFNetwork使用CFSocket来代表两端的通信端口,还可以通过CFStream读/写数据。

  1. 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

  2. 端口是16为整数,表示数据交给哪个通信程序处理,是应用程序和外界交流的出入口,包括一些数据结构和I/O。
    公认端口:从0到1023,紧紧绑定一些特定的服务。
    注册端口:从1024到49151,松散的绑定一些服务,适用于应用程序。
    动态和/私有端口:从49152到65535.

  3. 使用CFSocket实现TCP服务器端
    步骤:
    1>创建一个监听Socket Accept的CFSocket,并为kCFSocketAcceptCallBack事件绑定回调函数。
    2>调用CFSocketSetAddress()函数,将服务器的CFSocket绑定到本地IP地址和端口。
    3>将CFSocket作为source添加到指定线程的CFRunLoop上,并运行该线程的CFRunLoop,从而保证该CFSocket能持续不断的接受来自客户端的连接。

  4. 使用CFSocket实现TCP客户端
    步骤:
    1>创建一个不监听任何事件或监听Connection的CFSocket。如果要监听Connection,则需要为kCFSocketConnectCallBack事件绑定回调函数。
    2>调用CFSocketConnectionToAddress()函数,将客户端的CFSocket;连接到指定IP地址和端口的服务器上。
    3>得到客户端CFSocket之后,既可直接使用CFSocketNativeHandle进行读/写,也可通过CFSocket获取CFReadStreamRef、CFWriteStreamRef后进行读、写。

  5. 使用CocoaAsyncSocket实现TCP客户端
    降低直接使用CFSocket编程的复杂度,另外有开发者提供了一套开源的CocoaAsyncSocket库。
    CocoaAsyncSocket封装了CFNetwork底层的CFSocket和CFStream,并提供了异步操作,支持TCP和UDP。
    特性:

    • 非阻塞方式的读和写,而且可设置超时时长。
    • 自动的socket接受,如果调用它接受连接,它将为每个连接启动新的实例,当然也可以立即关闭这些连接。
    • 委托支持,错误、连接、接收、完整的读取、完整的写入、进度以及断开连接,都可通过代理模式调用。
    • 所有操作都封装在一个类中,开发者无需操作socket或流,该类封装了所有操作。

使用NSURLConnection

  1. 使用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://开始发送请求

  1. 使用使用NSURLConnection从网络获取数据的步骤:
    1>创建NSURLRequest对象,该对象代表对远程服务器的请求。包括:请求的URL,缓存策略,超时时长等。
    2>调用NSURLConnection的实例方法或类方法,以NSURLRequest对象为参数创建NSURLConnection即可发送请求。
    3>以异步方式加载服务器响应,则需要为NSURLConnection对象指定delegate对象,因此还需要为delegate对象实现特定的方法。

  2. 使用NSMutableURLRequest向服务器发送请求
    NSURLRequest只能想服务器发送简单的请求,不能添加请求头和请求参数,使用NSMutableURLRequest可以。
    -addValue:forHTTPHeaderField:为使用NSMutableURLRequest添加请求头。
    -setAllHTTPHeaderField:通过一个NSDictionary一次性为NSMutableURLRequest设置多个请求头。
    -setHTTPBody:设置NSMutableURLRequest的请求参数
    -setHTTPBodyStream:以NSInputStream为参数设置NSMutableURLRequest的请求参数
    -setHTTPMethod:设置提交请求方式,要么是POST,要么是GET。
    -setHTTPShouldHandleCookies:设置该HTTP请求是否处理Cookie。
    -setValue:forHTTPHeaderField:为指定的请求头设置请求值。

XML解析

  1. 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。
  2. NSXMLParser解析XML文档
    步骤:
    • 创建NSXMLParser对象。
    • 为NSXMLParser对象指定delegate对象,该delegate对象必须实现NSXMLParserDelegate协议,并根据需要实现协议中特定的方法。
    • 调用NSXMLParser对象的parse方法开始解析。
  3. libxml2解析XML文档
    使用C语言的库,准备步骤:
    • 为项目添加libxml2.dylib库
    • 添加头文件的搜索路径
      步骤:
    • 创建XMLTextReaderPtr对象.如果以本地XML文档来创建XMLTextReaderPtr对象,则调用XMLTextReaderFilename()函数即可。如果以内存中XML文档来创建该对象,则调用XMLReaderForMemeory()函数即可。
    • 依次调用XMLTextReaderxxx()函数来读取XML文档的元素名,元素值,属性等各种内容。
  4. GDataXML解析XML文档
    第三方开源库,对libxml2的宝座,底层依赖libxml2,既支持解析XML文档 ,也支持修改XML文档,支持XPath方式查询,提供了更好的面向对象的封装。
    准备步骤:

步骤:

- 调用GDataXMLDocument的初始化方法根据XML文档或XML字符初始化GDataXMLDocument对象。(GDataXMLDocument对象就是XML文档转换得到的DOM树)
- 调用GDataXMLDocument对象的rootElement方法即可获取该文档的根元素
- 获取根元素后,就可以根据XML元素之间的父子关系来逐层遍历,访问该XML文档中的每一个元素,从而获取XML元素的内容。
  1. GDataXML生成XML文档
    • 调用GDataXMLNode的elementWithName:方法创建 GDataXMLelement对象,并以该对象作为XML文档的根元素。
    • 调用GDataXMLNode的elementWithName:方法不断创建 GDataXMLelement对象(XML元素),并利用元素之间的父子关系组织这些XML元素。
    • 调用GDataXMLDocument对象的XMLData方法获取XML文档对应的NSData对象,调用NSData的输出方法将XML文档输出到指定文件或其他存储介质。
  2. GDataXML修改XML文档
    • 调用GDataXMLDocument方法根据指定的XML文档或者XML字符串来生成对应的GDataXMLDocument对象–它代表了XML文档在内存中的形式。
    • 获取GDataXMLDocument对象的根元素,然后利用元素之间父子关系添加子元素、删除子元素或修改元素的内容。
    • 调用GDataXMLDocument对象的XMLdata的方法获取XML文档对应的NSData 对象,调用NSdata的输出方法将XML文档输出到指定文件或其他存储介质。
    • 调用GDataXMLDocument对象的XMLdata的方法获取XML文档对的NSData对象,调用NSData的输出方法将XML文档输出到指定文件或其他存储介质

JSON解析

JSON具有跨平台,跨语言的优势。两种数据结构:

- 由key-value对组成的数据结构。
- 有序集合  
  1. 使用JSON语法创建对象
    直接创建一个JavaScript对象,
  2. 使用JSON语法创建数组
    var a = ['yeeku','nono'];
  3. 使用NSJSONSerialization处理JSON数据 (系统自带)
    满足条件:
    顶级对象只能是NSArray或NSDictionary。
    集合中包含对象只能是NSString,NSNumber,NSArray,NSDictionary或NSNull对象。
    所有NSDictionary的key只能是NSString。
    NSNumber保证的数值不是NaN或Infinity。
  4. 使用SBJson解析JSON数据
    提供了两个工具类:SBJsonParser和SBJsonWriter.
    SBJsonParser负责吧NSData或NSString形式的JSON数据转换为objective-c对象。
    SBJSonWriter负责把objective-c对象转换为NSData或NSString形式的JSON数据。
  5. 第三方类库解析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
2
3
4
5
6
- (id)objectFromJSONString;
- (id)objectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags;
- (id)objectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error;
- (id)mutableObjectFromJSONString;
- (id)mutableObjectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags;
- (id)mutableObjectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error;

JSONKit用分类为NSString、NSStringArray和NSDictionary增加了如下方法:将OC对象装潢为NSString和NSData形式的JSON数据。

1
2
- (NSData *)JSONData;
- (NSString *)JSONString;

使用AFNetworking实现网络通信

只是需要向web某个站点的某个简单页面提交请求并获取服务器响应,则使用NSURLConnection来完成。为了更好的处理web站点请求,包括处理Session,Cookie,可以用AFNetworking,用于发送HTTP请求,接受HTTP响应。但不会缓存服务器响应,不能执行HTML页面中嵌入的JavaScript代码,也不会对页面内容进行任何解析处理。AFNetworking还支持JSON、Plist属性文件和XML解析。

  1. 提交GET请求与提交POST请求
    步骤:

    • 创建AFHTTRequestOperationManager对象。
    • 根据服务器响应内容不同,为HTTORequestOperationManager对象指定不同的解析器。(JSON或Plist数据)
    • 如果需要发送GET请求,调用AFHTTRequestOperationManager对象的GET:parameters:success:failure:方法即可 。
    • 如果要发送POST请求,调用AFHTTRequestOperationManager对象的POST:parameters:success:failure:方法即可 。
    • 在success:参数指定的代码块中处理服务器响应成功的正确数据。
  2. 处理JSON和Plist响应
    可以直接将JSON和Plist转化为NSArray或NSDictionary对象。 AFHTTORequestOperationManager默认可以处理JSON或Plist对象。

  3. 处理XML响应
    为AFHTTORequestOperationManager显示使用
    AFXMLParserResponseSerializer响应解析器,当使用AFXMLParserResponseSerializer解析器时,服务器返回的数据是一个NSXMLParser对象。

  4. 上传文件
    AFHTTRequestOperationManager对象的POST: parameters:constructingBodyWithBlock:success:failure:方法提交POST请求即可,多了三个参数,一个是带AFMultipartFormData形参的代码块。

使用ASIHTTPRequest框架实现网络编程

  1. 发送同步或异步的GET请求
    准备步骤:
    目前不支持ARC,应该需要在支持ARC的项目中设置‘fno-objc-arc’选项来禁用ARC。
    步骤:
  1. 使用代码块
    ASIHTTPRequest发送异步请求,即可使用delegate为ASIHTTPRequest设置回调处理代码,也可用代码块来设置回调处理代码。
    -setCompletionBlock:设置发送请求、获取服务器响应完成时激发的代码块。
    `-setFailedBlock:获取发送请求失败时激发的代码块。
文章目录
  1. 1. iOS网络编程
    1. 1.1. 检测网络状态
    2. 1.2. 使用CFNetwork实现TCP协议的通信
    3. 1.3. 使用NSURLConnection
    4. 1.4. XML解析
    5. 1.5. JSON解析
    6. 1.6. 使用AFNetworking实现网络通信
    7. 1.7. 使用ASIHTTPRequest框架实现网络编程
本站总访问量 本站访客数人次 ,