iOS底层网络协议

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

HTTP的通信分为两大步骤: 发送请求 和 接收响应。
请求:
一个请求包含以下内容:
请求行:包含了请求方法、请求资源路径、HTTP协议版本
GET /MJServer/resources/images/1.jpg HTTP/1.1
请求头:包含了对客户端的环境描述,客户端能接受的数据类型,客户端请求的主机地址等信息
Host: 192.168.1.105:8080 // 客户端想访问的服务器主机地址
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9) Firefox/30.0
// 客户端的类型,客户端的软件环境
Accept: text/html, / // 客户端所能接收的数据类型
Accept-Language: zh-cn // 客户端的语言环境
Accept-Encoding: gzip // 客户端支持的数据压缩格式

请求体:客户端发给服务器的具体数据,比如文件数据
OC中请求用NSURLRequest,默认超时时常:60s 缓存策略:
在这里插入图片描述
请求方式:http的post与get区别与联系,实践中如何选择它们?
在这里插入图片描述
在这里插入图片描述
1)get是从服务器上获取数据,post是向服务器传送数据。
2)在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。
3)对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4)GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
5)安全性问题:
使用Get的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用post为好。
6)Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。
GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

响应:
一个响应包括:
状态行:包含了HTTP协议版本、状态码、状态英文名称
HTTP/1.1 200 OK
响应头:包含了对服务器和返回数据的描述
Server: Apache-Coyote/1.1 // 服务器的类型
Content-Type: image/jpeg // 返回数据的类型
Content-Length: 56811 // 返回数据的长度
Date: Mon, 23 Jun 2014 12:54:52 GMT // 响应的时间
实体内容:服务器返回给客户端的具体数据,比如文件数据

OC中响应用NSURLRespose
NSURLRespones返回给客户端的回应包含:
状态行 : 包含了HTTP协议版本、状态码、状态英文名称
响应头 : 包含了对服务器的描述、对返回数据的描述
实体内容:服务器返回给客户端的具体二进制数据
常用属性: expectedContentLength (下载时返回文件的长度)
suggestedFilename(建议保存的文件名)
在这里插入图片描述

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
网络通信其实就是Socket间的通信
数据在两个Socket间通过IO传输
socket 实现的具体步骤
// 1. 建立 socket
int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
// 2. 连接到服务器
int result = connect(clientSocket, (const struct sockaddr *)&serverAddress, sizeof(serverAddress));
// 3. 发送数据
ssize_t sendLen = send(clientSocket, message.UTF8String, strlen(message.UTF8String), 0)
// 4. 接收数据
ssize_t recvLen = recv(clientSocket, buffer, sizeof(buffer), 0);
// 5. 关闭链接
close(clientSocket);

TCP/UDP 区别
UDP(用户数据报协议)
1)只管发送,不确认对方是否接收到
2)将数据及源和目的封装成数据包中,不需要建立连接
3)每个数据报的大小限制在64K之内
4)因为无需连接,速度快,但也因此是不可靠协议
应用场景:多媒体教室/网络流媒体

TCP(传输控制协议)
1)建立连接,形成传输数据的通道
2)在连接中进行数据传输(数据大小不受限制)
3)通过三次握手完成连接,是可靠协议,安全送达
4)必须建立连接,效率会稍低

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

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

NSURLConnection 的历史
•iOS 2.0 推出的,至今有10多年的历史
•苹果几乎没有对 NSURLConnection 做太大的改动
•sendAsynchronousRequest 方法是 iOS 5.0 之后,苹果推出的
•在 iOS 5.0 之前,苹果的网络开发是处于"黑暗时代"!
•需要使用"代理"方法,还需要使用运行循环,才能够处理复杂的网络请求!
NSURLConnection下载总结
① NSURLConnectionDownloadDelegate 代理方法是为 Newsstand Kit’s(杂志包) 创建的下载服务的Newsstand 主要在国外使用比较广泛,国内极少如果使用 NSURLConnectionDownloadDelegate 代理方法监听下载进度,能够监听到进度,但是:找不到下载的文件;
② NSURLConnectionData代理方法可以监听到下载进度,可以完成下载操作,但是在下载过程中会出现内存峰值的情况,是因为在文件写入的时候采取的是文件拼接的方式;
③ 为了解决上述的问题可以采用NSFileHandle,NSOutputStream解决下载过程中的峰值问题NSFileHandle:文件"句柄(指针)",操纵,提示:凡是看到 Handle 这个单词,就表示对前面一个单词(File)的独立操作使用NSFileHandle时文件会被重复的追加这个时候使用;
[[NSFileManager defaultManager] removeItemAtPath:self.targetPath error:NULL];(下载前删除文件)
④ 断点续传(下载)实现思路(设置 HTTPHeaderField:@“Range”)

           Range
           bytes=xxx-yyy  从 xxx 下载 yyy 个字节
           bytes=xxx-     从 xxx 下载到文件末尾
           bytes=-xxx     从文件头,下载 xxx 个字节

          检查服务器文件信息(head方法 获取文件大小)
          检查本地文件
          如果比服务器文件小,续传
          如果比服务器文件大,重新下载
          如果和服务器文件一样,下载完成  

NSURLSession
1)NSURLSession是iOS7中新的网络接口,与NSURLConnection是并列的。
2)当程序在前台时,NSURLSession与NSURLConnection大部分可以互相替代
3)NSURLSession支持后台网络操作,除非用户强行关闭
NSURLSession提供的功能:
1)通过URL将数据下载到内存
2)通过URL将数据下载到文件系统
3)将数据上传到指定URL
4)在后台完成上述功能

NSURLSessionConfiguration的三种类型:
(1)defaultSessionConfiguration默认session配置,类似NSURLConnection的标准配置,使用硬盘来存储缓存数据
(2)ephemeralSessionConfiguration临时session配置,与默认配置相比,这个配置不会将缓存、cookie等存在本地,只会存在内存里,所以当程序退出时,所有的数据都会消失
(3)backgroundSessionConfiguration(8.0新出的)后台session配置,与默认配置类似,不同的是会在后台开启另一个线程来处理网络数据

NSURLSession使用NSURLSessionTask来具体执行网络请求的任务
NSURLSessionTask支持网络请求的取消、暂停和恢复,比如下载文件暂停之后再恢复就能够自动从上次的进度继续下载
nNSURLSessionTask还能获取数据的读取进度

NSURLSessionTask的三种类型:
(1)NSURLSessionDataTask 处理一般的NSData数据对象,比如通过GET或POST方式从服务器获取JSON或XML返回等等,但不支持后台获取
(2)NSURLSessionUploadTask 用于PUT上传文件,支持后台上传
(3)NSURLSessionDownloadTask 用于下载文件,支持后台下载

NSURLSession断点下载实现:
1)实现代理方法:
2)在暂停时取消task操作会返回一个resumeData
3)继续后从resumeData处开始下载。

NSURLSession 与NSURLConnection的区别
1)可以使用系统全局的sharedSession单例来满足大多数的需求
2)相比较NSURLConnection的返回处理,NSURLSession提供了灵活的数据返回方式,可以使用简单的block方式来处理返回数据,也可以使用更强大的delegate
3)URLSession是线程安全的,在多线程方面的支持也比URLConnection要好
4)NSURLSessionTask的引入,想想之前用URLConnection上传文件拼接HTTPbody(请求体)苦逼的样子

AFN与ASI对比

-AFN
1.基于 NSURLConnection & NSURLSession 进行的封装
2.使用简单
3.URL直接传字符串
4.响应回来得到的数据可以半自动反序列化(JSon可以自动(AFN默认JSon解析),XML需要手动)
5.代码回调在主线程,不需要关心线程间通讯
6.用字典传递参数(parameters),不用写在URL里(GET),或请求体里(POST)
7.AFN 实现断点续传很简单 是需要实现 DownLoadOperation 中的方法即可

-ASI
1. 基于 CFNetwork 进行的封装 Core Foundation,是底层的 C 语言的框架,ASI 的效率是很好的,被成为”HTTP终结者”,但已停止更新
2. 使用非常灵活,给程序员提供了各种使用的可能和空间!
* 用代理
* 用块代码
* 自定义监听方法
* 自定义代理-> 开发者可以定制专属自己的网络管理工具!
(提示:真正开发中,只要选择一个我们比较能够掌握的就可以了!)
3. 使用难度大
4. MRC的,需要考虑到 ARC & MRC 混编的问题
5. 返回内容只是提供了二进制数据,或者字符串(前提结果确实是字符串!)
6. ASI的序列化和反序列化需要程序员自己来!

AFN 与 ASI 有什么区别
1)AFN基于NSURL,ASI基于底层的CFNetwork框架,因此ASI的性能优于AFN, 被成为”HTTP终结者”,但已停止更新
2)AFN采取block的方式处理请求,ASI最初采取delegate的方式处理请求,后面也增加了block的方式
3)AFN只封装了一些常用功能,满足基本需求,直接忽略了很多扩展功能,比如没有封装同步请求;ASI提供的功能较多,预留了各种接口和工具供开发者自行扩展
4)AFN直接解析服务器返回的JSON、XML等数据,而ASI比较原始,返回的是NSData二进制数据

JSON/XML 解析
JSON:
1)JSon解析一般有四种方式TouchJson、 SBJson JSONKit 和 NSJSONSerialization,
2)性能和速度:NSJSONSerialization > JSONKit > SBJSON > TouchJson,
3)NSJSONSerialization是iOS5之后系统提供的,其他的为第三方类库
4)NSJSONSerialization有两个方法: dataWithJSONObject:从OC对象转换成JSON数据 JSONObjectWithData:从JSON转成OC对象
XML:
IOS中对XML文件的解析有两种方式Dom(mac ) 和Sax,但是建议用苹果官方推荐的方法Sax方法,sax解析主要是依赖代理的方法进行的。NSXMLParserDelegate
解析方法:
SAX 解析的步骤(通过NSXMLParser代理实现解析 一边读取XML文档一边处理,不必等整个文档加载完之后才采取操作,当在读取解析过程中遇到需要处理的对象,会发出通知对其进行处理。)
1.开始文档 - 准备工作
2.开始"节点"
3.发现节点内部的内容,每一个节点,可能需要多次才能找完
4.结束"节点"
5.结束文档 - 解析结束
6.2 3 4 不断循环 直到内容结束

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值