关于iOS网络基础

  • 网络基本概念
    • 概念
    • 核心
    • 服务器
  • URL和HTTP协议
    • URL
    • HTTP协议
  • 请求和响应
    • 请求
    • 响应
  • 网络开发方案
  • NSURLConnection
    • 加载HTML数据和错误处理
    • 展示HTML数据和反序列化
  • NSURLSession
    • 简介
    • 结构图
    • 说明
    • 使用
  • 网络通信三要素
    • IP地址(主机名)
    • 端口号
    • 传输协议

网络基本概念

  • 概念

    • 现在移动互联网时代,移动应用的特征:
      • 几乎所有应用都需要网络.比如QQ、微信、微博、网易新闻、优酷、百度地图、快播。
      • 只有通过网络跟外界进行数据交互、数据更新,应用才能保持新鲜与活力。
      • 如果没有了网络,也就缺少了数据变化,无论外观多么华丽,终将变成一潭死水。
    • 学习网络编程:
      • 可以掌握实时更新数据的手段。
      • 是开发优秀应用的前提和基础。
  • 核心

    • 网络的核心是请求和响应。
  • 服务器

    • 为客户端提供数据的特殊的计算机。
    • 按照软件开发阶段来分,服务器可以大致分为2种:
      • 远程服务器
        • 别名:外网服务器、正式服务器。
        • 使用阶段:应用上线后使用的服务器。
        • 使用人群:供全体用户使用。
        • 速度:取决于服务器的性能、用户的网速。
      • 本地服务器
        • 别名:内网服务器、测试服务器。
        • 使用阶段:应用处于开发、测试阶段使用的服务器。
        • 使用人群:仅供公司内部的开发人员、测试人员使用。
        • 速度:由于是局域网,所以速度飞快,有助于提高开发测试效率。

URL和HTTP协议

  • URL

    • URL 的全称是:Uniform Resource Locator(统一资源定位符)
    • 基本格式:协议头://主机地址/路径
      • 协议头:不同的协议,表示不同的资源查找及传输方式
      • 主机地址:存放资源主机的 IP 地址(域名)
      • 路径:资源在主机中的具体位置
  • HTTP协议

    • HTTP协议概念:的全称是 Hypertext Transfer Protocol,超文本传输协议
      • 超文本:网络上的数据是多种多样的.除了文字,数字以外,还有视频,音频,图片...都是属于超文本
      • 传输:客户端和服务器之间的数据传递的过程.传递的都是二进制数据
      • 协议:规定客户端和服务器之间的数据传递格式
    • HTTP协议作用
      • 规定客户端和服务器之间的数据传输格式
      • 让客户端和服务器能有效地进行数据沟通
      • HTTP 协议是网络编程使用最为广泛的协议
    • HTTP协议特点
      • 支持客户/服务器模式
      • 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同
      • 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记
      • 无连接:无连接的含义是限制每次连接只处理一个请求
      • 无状态:HTTP协议是无状态协议
    • 长连接和短连接 & 心跳包
      • 长连接
        • 一旦连接建立之后,始终保持连接状态,除非断网或者主动退出登录
        • 后续只需发送和接收数据即可,数据响应更及时
        • 长连接对服务器资源占用比较大
        • 对交互响应要求快的应用,例如即时通讯,需要使用长连接
      • 短连接
        • 非持续链接和持续链接都是短链接
        • 数据请求结束后,会断开连接
        • 能够及时释放服务器资源
        • 让服务器能够为更多的用户提供服务
      • 心跳包
        • 是检测长连接的重要技术手段
        • 可以由服务器发送
        • 也可以由客户端发送

请求和响应(★★★)

  • 请求

HTTP协议规定:一个完整的由客户端发给服务器的HTTP请求需要包含以下内容:请求行、请求头、请求体(可选)

* 请求行:指定请求方法、请求资源路径以及`HTTP协议版本`
    * `GET / HTTP/1.1`:GET / 后面的 / 表示访问根目录
* 请求头:对客户端的环境描述、客户端请求的主机地址等信息.至少包含以下信息
* 请求体:客户端发给服务器的具体数据,例如要上传的文件数据
    * `GET请求没有请求体`
    * `POST请求有请求体.告诉服务器一些类似于用户名和密码的信息.比如注册和登陆`
* 请求格式
    * 每一项请求信息末尾使用 `\r\n`
    * 最后一个请求项末尾使用 `\r\n\r\n` 表示请求结束
  • 响应

HTTP协议规定:一个完整的HTTP响应包含以下内容:状态行、响应头、响应体。

* 状态行:包含了`HTTP协议版本`、`状态码`、`状态英文名称`
* 响应头:服务器告诉客户端一些信息。包含了`对服务器的描述`、`对返回数据的描述`
* 响应体:`服务器返回给客户端的二进制数据`

网络开发方案

  • 常见的发送HTTP请求的方案包括

    • 苹果官方
    名称 说明
    NSURLConnection iOS 2.0 推出,用法简单,最古老最经典最直接的一种方案
    NSURLSession iOS 7 推出,功能比 NSURLConnection 更加强大
    CFNetwork NSURL 的底层,纯C语言,几乎不用
    • 第三方框架
    名称 底层 说明
    ASIHttpRequest CFNetwork 外号HTTP终结者功能极其强大,2012年 10 月停止更新,MRC
    AFNetworking NSURLConnection&NSURLSession 简单易用,提供了基本够用的常用功能,维护和使用者多
    MKNetworkKit NSURLConnection 简单易用,产自三哥的故乡印度,维护和使用者少
    Alamofire NSURLSession MATTT 的又一力作,Swift 开发,轻量级的 HTTP 解决方案,目前功能还远不如 AFNetworking

NSURLConnection(★★)

  • 加载HTML数据和错误处理

    • 步骤:
      • NSURL:确定要访问的资源
      • NSURLRequest:根据URL建立请求,向服务器索要数据
      • NSURLConnection:建立网络连接,将请求发送给服务器
    • 例子
```

// 1. URL
NSURL *URL = [NSURL URLWithString:@"http://www.baidu.com"];

// 2. 请求(request)
NSURLRequest *request = [NSURLRequest requestWithURL:URL];

// 3. 异步发送请求
/*
 参数1 : 请求对象
 参数2 : 队列;`completionHandler`的回调队列;
        如果想在回调里面刷新UI,选择主队列;反之,可以任意选择
 参数3 : 得到服务器的响应之后的回调
 提示 : `sendAsynchronousRequest` 默认就是在子线程异步执行的
 */
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
    
    // response : 响应头
    // data : 响应体
    // connectionError : 错误信息
    
    // 4. 处理响应 : 错误处理 (开发中一定要做)
    if (connectionError == nil && data != nil) {
        NSLog(@"%@ -- %@",response,data);
        
    } else {
        NSLog(@"%@",connectionError);
    }
}];

```
  • 展示HTML数据和反序列化

    • 展示HTML数据
      • 网页上的数据是html形式的字符串.所以我们获取到的百度首页的二进制数据是html形式的字符串
      • 当链接没有出错和响应体不为空时,再将服务器返回的二进制数据(响应体)转换成html形式的字符串
      • html形式的字符串可以展示在网页上.iOS有个控件UIWebView,专门展示网页的
    // 1. URL
    NSURL *URL = [NSURL URLWithString:@"http://www.baidu.com"];
    
    // 2. 请求(request) : 客户端告诉服务一些额外的信息
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    
    // 3. 异步发送请求
    /*
     参数1 : 请求对象
     参数2 : 队列;`completionHandler`的回调队列;
            如果想在回调里面刷新UI,选择主队列;反之,可以任意选择
     参数3 : 得到服务器的响应之后的回调
     提示 : `sendAsynchronousRequest` 默认就是在子线程异步执行的
     */
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        
        // response : 响应头
        // data : 响应体,保存的原始数据html格式的字符串,二进制里面保存的原始数据是什么,反序列化之后就应该是什么
        // connectionError : 错误信息
        
        // 4. 处理响应 : 错误处理 (开发中一定要做)
        if (connectionError == nil && data != nil) {
    

// NSLog(@"%@ -- %@",response,data);

        // 提示 : 服务器返回给客户端的原始数据是二进制的,客户端无法直接使用的;
        // 需要把二进制转换成客户端可以直接使用的OC对象;这个过程叫做反序列化 / 数据解析;
        NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

// NSLog(@"%@",html);

        // 把html格式的字符串展示在网页上
        [self.webView loadHTMLString:html baseURL:URL];
        
    } else {
        NSLog(@"%@",connectionError);
    }
}];

``` 

* 反序列化:`服务器返回给客户端的是二进制数据,客户端没法直接使用.将二进制数据转换成OC对象 (字符串 字典 数组) 的过程叫做反序列化,也叫作数据解析`
![](http://ww4.sinaimg.cn/mw690/ad98b285jw1fbur4zgc79j20te0m8afh.jpg)

NSURLSession(★★★)

  • 简介

    • iOS7.0推出的.用于替代 NSURLConnection
    • 支持后台运行的网络任务
    • 请求可以使用同样的配置容器
    • 直接使用系统方法可以实现文件上传和下载
    • 通过代理方法可以获取文件上传和下载的进度
    • block 和代理都对文件上传和下载起作用
      • 注意:上传时block和代理可以同时使用。下载时不行。
  • 结构图

  • 说明

    • 为了方便程序员使用,苹果提供了一个全局 session
    • 所有的 任务(Task) 都是由 session 发起的
    • 所有的任务默认是挂起的,需要 resume
    • 完成回调是异步的
    • session可以自定义,自定义的时候可以同时设置代理
    • AFN 底层就是对 NSURLSession 的封装
  • 使用

// 1.URL : 使用本地服务器的数据做测试
    NSURL *URL = [NSURL URLWithString:@"http:xxxxxxxxxxx"];
    
    // 2.获取session(单例)
    NSURLSession *session = [NSURLSession sharedSession];
    
    // 3.session发起任务(task)
    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:URL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        // 5.处理响应 : 错误判断
        if (error == nil && data != nil) {
            
            // 反序列化...解析json
            id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
            NSLog(@"%@ -- %@",[result class],result);
            
        } else {
            NSLog(@"%@",error);
        }
    }];
    
    // 4.启动任务
    [dataTask resume];

网络通信三要素

  • IP地址(主机名)

    • 网络中设备的标示
    • 不易记忆,可以用主机名(域名) www.baidu.com 和 119.75.217.109
  • 端口号

    • 用于标示进程的逻辑地址,不同进程的标示
    • 有效端口:0~65535 其中 0~1024由系统使用或者保留端口
    • 开发中不要使用 1024 以下的端口
    • 注意 : 跟HTTP相关的端口一定是80.服务器上有个进程是专门处理HTTP请求的,端口号是80
  • 传输协议

    • UDP(用户数据报协议)
      • 建立连接,形成传输数据的通道
      • 将数据源和目的封装成数据包中,不需要建立连接
      • 不需要建立连接,速度快
      • 应用场景:多媒体教室/网络流媒体、视频实时共享、游戏卡屏的效果就是数据在传输时掉包了.有一部分没有接收到就不会显示.等你重新可以正常接收数据包时
    • TCP(传输控制协议)
      • 建立连接,形成传输数据的通道
      • 在连接中进行大数据传输(数据大小不受限制)
      • 通过三次握手完成连接,是可靠协议,安全送达
      • 必须建立连接,效率会稍低
      • TCP协议的传输速度比UDP协议慢
    • 三次握手


    * 第一次握手:第一次建立连接时,客户端发送同步序列编号到服务器,并进入发送状态等待服务器确认
    * 第二次握手:第二次服务器收到同步序列编号,并确认同时自己也发送一个同步序列编号+确认标志此时服务器进入接收状态
    * 第三次握手:第三次客户端收到服务器发送的包,并向服务器发送确认标志,随后链接成功。注意实在链接成功后进行数据传输
    • 四次握手(了解)

    第一次客户端向服务器发送一个带有结束标记的报文、第二次服务器收到报文后,向客户端发送一个确认序号,同时通知自己相应的应用程序,对方要求关闭连接、第三次服务器向客户端发送一个带有结束标记的报文、第四次客户端收到报文后,向服务器发送一个确认序号,连接关闭


感谢读到最后的朋友,最后祝大家新年快乐,请点赞支持一下,谢谢!

你可能感兴趣的:(关于iOS网络基础)