关于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协议慢
    • 三次握手


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

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


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容