- 网络基本概念
- 概念
- 核心
- 服务器
- URL和HTTP协议
- URL
- HTTP协议
- 请求和响应
- 请求
- 响应
- 网络开发方案
- NSURLConnection
- 加载HTML数据和错误处理
- 展示HTML数据和反序列化
- NSURLSession
- 简介
- 结构图
- 说明
- 使用
- 网络通信三要素
- IP地址(主机名)
- 端口号
- 传输协议
网络基本概念
-
概念
- 现在移动互联网时代,移动应用的特征:
几乎所有应用都需要网络.比如QQ、微信、微博、网易新闻、优酷、百度地图、快播。
只有通过网络跟外界进行数据交互、数据更新,应用才能保持新鲜与活力。
如果没有了网络,也就缺少了数据变化,无论外观多么华丽,终将变成一潭死水。
- 学习网络编程:
可以掌握实时更新数据的手段。
是开发优秀应用的前提和基础。
- 现在移动互联网时代,移动应用的特征:
-
核心
-
网络的核心是请求和响应。
-
-
服务器
- 为客户端提供数据的特殊的计算机。
- 按照软件开发阶段来分,服务器可以大致分为2种:
- 远程服务器
别名:外网服务器、正式服务器。
使用阶段:应用上线后使用的服务器。
使用人群:供全体用户使用。
速度:取决于服务器的性能、用户的网速。
- 本地服务器
别名:内网服务器、测试服务器。
使用阶段:应用处于开发、测试阶段使用的服务器。
使用人群:仅供公司内部的开发人员、测试人员使用。
速度:由于是局域网,所以速度飞快,有助于提高开发测试效率。
- 远程服务器
URL和HTTP协议
-
URL
- URL 的全称是:
Uniform Resource Locator(统一资源定位符)
- 基本格式:
协议头://主机地址/路径
- 协议头:
不同的协议,表示不同的资源查找及传输方式
- 主机地址:
存放资源主机的 IP 地址(域名)
- 路径:
资源在主机中的具体位置
- 协议头:
- URL 的全称是:
-
HTTP协议
- HTTP协议概念:
的全称是 Hypertext Transfer Protocol,超文本传输协议
- 超文本:
网络上的数据是多种多样的.除了文字,数字以外,还有视频,音频,图片...都是属于超文本
- 传输:
客户端和服务器之间的数据传递的过程.传递的都是二进制数据
- 协议:
规定客户端和服务器之间的数据传递格式
- 超文本:
- HTTP协议作用
规定客户端和服务器之间的数据传输格式
让客户端和服务器能有效地进行数据沟通
-
HTTP 协议是网络编程使用最为广泛的协议
- HTTP协议特点
支持客户/服务器模式
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同
灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记
无连接:无连接的含义是限制每次连接只处理一个请求
无状态:HTTP协议是无状态协议
- 长连接和短连接 & 心跳包
- 长连接
一旦连接建立之后,始终保持连接状态,除非断网或者主动退出登录
后续只需发送和接收数据即可,数据响应更及时
长连接对服务器资源占用比较大
对交互响应要求快的应用,例如即时通讯,需要使用长连接
- 短连接
非持续链接和持续链接都是短链接
数据请求结束后,会断开连接
能够及时释放服务器资源
让服务器能够为更多的用户提供服务
- 心跳包
是检测长连接的重要技术手段
可以由服务器发送
也可以由客户端发送
- 长连接
- 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) {
- 展示HTML数据
// 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协议慢
-
三次握手
* 第一次握手:第一次建立连接时,客户端发送同步序列编号到服务器,并进入发送状态等待服务器确认
* 第二次握手:第二次服务器收到同步序列编号,并确认同时自己也发送一个同步序列编号+确认标志此时服务器进入接收状态
* 第三次握手:第三次客户端收到服务器发送的包,并向服务器发送确认标志,随后链接成功。注意实在链接成功后进行数据传输
- 四次握手(了解)
第一次
客户端向服务器发送一个带有结束标记的报文、第二次
服务器收到报文后,向客户端发送一个确认序号,同时通知自己相应的应用程序,对方要求关闭连接、第三次
服务器向客户端发送一个带有结束标记的报文、第四次
客户端收到报文后,向服务器发送一个确认序号,连接关闭 - UDP(用户数据报协议)
感谢读到最后的朋友,最后祝大家新年快乐,请点赞支持一下,谢谢!
网友评论