您的位置:首页 > 理论基础 > 计算机网络

【学习总结】网络

2015-10-21 20:43 483 查看

什么是HTTP通讯过程?

1. 请求 (客户端发送请求信息到服务器的过程)

-> 请求行 : 请求方法 , 请求路径 , HTTP协议的版本

*GET , /Server/resources/vidios/1.mp4 , HTTP/1.1

-> 请求头 : 客户端的一些描述信息

User - Agent : 客户端的环境 (软件环境)

-> 请求体 : POST方式的请求,才有这个

* 请求参数, 将所有参数包装好,发送给服务器

2. 响应(服务器接收到请求之后, 会返回一些东西给客户端,这个过程叫服务器的响应)

-> 状态行(响应行) : HTTP协议的版本, 响应状态码 , 响应状态描述

HTTP/ 1.1 200 OK

-> 响应头 : 服务器的描述信息

* Content-Type : 服务器返回给客户端的内容类型

* Content-Length 服务器返回给客户端的内容的长度 (比如文件的大小)

-> 实体内容(响应体) :

* 服务器返回给客户端具体的数据, 比如文件数据

怎样发送HTTP请求的方法?

1. GET

-> 特点 : 所有的请求参数都要拼接在URL后面

-> 缺点 :

  * 在URL中暴露了所有的请求数据, 不太安全

   * URL的长度有限制, 不能发送太多的参数

->使用场合 : 一般用作访问服务器资源,索要数据,没数据交互一般用GET请求

2. POST

-> 特点 : 把所有请求参数放大请求体(HTTPBody)中,并且参数大小没有限制

-> 缺点 : 如果单纯索要数据,不需要做数据交互操作,即显过于复杂.

-> 使用场合 :

  * 除了向服务器索要数据以外的请求, 都可以用POST请求.

  * 如果发给服务器的数据是一些隐私,敏感的数据,绝对要用POST请求.

发送HTTP请求需要注意什么?

1.URL转码

-> url不能包含中文, 所以拼接的中文一定要转码

NSString *urlStr = [NSString stringWithFormat:@"http://localhost:8080/login?username=%@&pwd=%@",usernameText, pwdText];

// 将中文转码.

[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

2.设置超时

NSURLRequest *request = [NSMutableURLRequest requestWithURL:url];

// 为请求设置超时时间很重要,影响用户体验

request.timeoutInterval = 8;

什么是JSON? 什么是XML?

怎样解释服务器返回的JSON数据和XML数据?

大文件下载的思路?

1. 方案 : 利用NSURLConnection和它的代理方法

-> 发送一个请求

// 1.创建下载地址URL
NSURL *url = [NSURL URLWithString:@"这里写上下载地址"];

// 2.创建Request请求,并且将URL包装成请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];

// 3.利用NSURLConnection发送请求, 完成下载(创建完conn对象后,会自动发起一个异步请求)
[NSURLConnection connectionWithRequest:request delegate:self];


->服务器的响应,会在NSURLConnection的代理方法中实现, 所以代理方法中会处理这些返回的数据

#pragma mark - NSURLConnectionDataDelegate代理方法
// 一开始下载就会调用下面的代理方法

/**
*  请求失败时调用(请求超时、网络异常)
*
*  @param error      错误原因
*/
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"这里写上请求超时的时候的操作");
}

/**
*  1.接收到服务器的响应就会调用
*
*  @param response   响应
*/
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
// 文件路径
// 拿到沙盒的Cachs文件夹 , 一般传入沙盒的Cache文件中
NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];

NSString *filepath = [caches stringByAppendingPathComponent:@"文件名"];

// 创建一个空的文件 到 沙盒中
// NSFileManager 文件管理者
NSFileManager *mgr = [NSFileManager defaultManager]; // 这个是一个单例

// 根据路径创建一个文件
[mgr createFileAtPath:filepath contents:nil attributes:nil];

// 创建一个用来写数据的文件句柄
self.writeHandle = [NSFileHandle fileHandleForWritingAtPath:filepath];

}

/**
*  2.当接收到服务器返回的实体数据时调用(具体内容,这个方法可能会被调用多次)
*
*  @param data       这次返回的数据
*/
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// 移动到文件的最后面
[self.writeHandle seekToEndOfFile];

// 将数据写入沙盒
[self.writeHandle writeData:data];

}

/**
*  3.加载完毕后调用(服务器的数据已经完全返回后)
*/
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{

// 关闭文件 , 用完要关闭, 如果不关闭,管道会长期存在
[self.writeHandle closeFile];
// 并且需要清空,防止内存泄露
self.writeHandle = nil;
}


思路就是 : 创建请求 -> 发送请求 -> 代用代理方法接收服务器响应 -> 然后在接收到服务器的响应时创建一个空文件

-> 然后在接收到实体数据时会调用didReceiveData方法(方法会调用很多次) -> 方法内部,不断移动句柄与写入数据

-> 数据接收完毕后,关闭句柄管道,清空句柄对象.

2. 一些注意点

不能用NSMytableData来拼接服务器返回的数据. 因为NSMytableData会将数据存储到内存,内存会瞬时增大.

NSURLConnection发送异步请求有哪些方法?

1. block

[NSURLConnection sendAsynchronousRequest:<#(NSURLRequest *)#> queue:<#(NSOperationQueue *)#> completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// 数据接收完才执行这里的代码块
}]


2.代理形式

这种也是异步请求的形式, 调用NSURLConnection connectionWithRequest方法, 传入请求就会自动发送异步请求

不过这种方式需要设置代理接收,服务器返回的信息.适合用于大文件下载

// 1.URL
NSURL *url = [NSURL URLWithString:@"下载地址"];

// 2.请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];

// 3.下载(创建完conn对象后,会自动发起一个异步请求)
[NSURLConnection connectionWithRequest:request delegate:self];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: