[iOS 多线程 & 网络 - 2.0] - 发送接收 服务器信息

A.搭建java服务器

使用eclipse、tomcat和struts2框架搭建一个简单的服务器

1.准备好合适版本的JDK、eclipse EE、tomcat、struts2 框架包

2.配置JDK和tomcat系统变量

3.在eclipse中创建一个Dynamic Web Project, 勾选创建web.xml

4.解压一个struts2中的app范例,参考其中的web.xml和struts.xml配置

5.配置tomcat,注意配置正确的服务器的路径和发布路径,不要使用默认的eclipse中的路径

6.引入资源文件,创建相应的ActionSupport就可以处理外部信息了

B.iOS中基本的服务器请求

1.get和post

GET和POST是两种最常用的与服务器进行交互的HTTP方法
GET
GET的语义是获取指定URL的资源
将数据按照variable=value的形式,添加到action所指向的URL后面,并且两者使用"?"连接,各变量之间使用"&"连接
貌似不安全,因为在传输过程中,数据被放在请求的URL中

传输的数据量小,这主要是因为受URL长度限制

POST
POST的语义是向指定URL的资源添加数据
将数据放在数据体中,按照变量和值相对应的方式,传递到action所指向URL
所有数据对用户来说不可见
可以传输大量数据,上传文件只能使用Post

C.iOS发送网络请求

1.发送步骤

实例化URL(网络资源)

根据URL建立URLRequest(网络请求)
默认为GET请求
对于POST请求,需要创建请求的数据体
利用URLConnection发送网络请求(建立连接)
获得结果

NSURLConnection提供了两个静态方法可以直接以同步或异步的方式向服务器发送网络请求
同步请求:
sendSynchronousRequest:returningResponse:error:
异步请求:
sendAsynchronousRequest:queue: completionHandler:

2.网络传输中的二进制流

在网络请求过程中,接收数据的过程实际上是通过NSURLConnectionDataDelegate来实现的,常用代理方法包括:

服务器开始返回数据,准备工作
(void)connection:didReceiveResponse:
收到服务器返回的数据,本方法会被调用多次
- (void)connection:didReceiveData:
数据接收完毕,做数据的最后处理
(void)connectionDidFinishLoading:
网络连接错误
- (void)connection:didFailWithError:

D.练习代码

 

1.使用get请求

 1 (1).使用同步方法发送get请求(不常用)
 2 /** 发送get消息 */
 3 - (void) testGet {
 4     NSString *requestStr = [NSString stringWithFormat:@"http://192.168.0.21:8080/MyTestServer/login?user=%@&password=%@", self.userField.text, self.passwordField.text];
 5
 6     NSURL *url = [NSURL URLWithString:requestStr];
 7
 8     // 默认就是get请求
 9     NSURLRequest *request = [NSURLRequest requestWithURL:url];
10
11     // 使用同步方法发送请求
12     [self sendSynRequest:request];
13 }
14
15 /** 同步发送请求 */
16 - (void) sendSynRequest:(NSURLRequest *) request {
17     // 同步发送信息
18     NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
19
20     [self dealWithResponseData:data];
21 }
22
23 /** 处理返回数据 */
24 - (void) dealWithResponseData:(NSData *) data {
25     // 解析数据
26     if (data) { // 得到返回数据
27         // 解除屏幕锁
28         [MBProgressHUD hideHUD];
29
30         // 解析json数据
31         NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
32
33         // 处理返回的数据
34         NSString *result = dict[@"success"];
35         if (result) {
36             [MBProgressHUD showSuccess:result];
37         } else {
38             result = dict[@"error"];
39             if (result) {
40                 [MBProgressHUD showError:result];
41             }
42         }
43     } else {
44         [MBProgressHUD showError:@"网络繁忙,请稍后再试~"];
45     }
46 }

(2).使用异步方法发送get请求

1 /** 异步发送请求 */
2 - (void) sendAsynRequest:(NSURLRequest *) request {
3     NSOperationQueue *queue = [NSOperationQueue mainQueue];
4     [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
5
6         [self dealWithResponseData:data];
7     }];
8 }

2.使用NSURLConnectionDataDelegate代理发送异步请求

(1)遵守协议

1 @interface ViewController () <NSURLConnectionDataDelegate>

(2)设置代理、发送请求

1 /** 使用start & 代理发送、处理异步请求 */
2 - (void) sendAsynRequestWithDelegate:(NSURLRequest *) request {
3     NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
4     [connection start];
5 }

(3)实现代理方法

 1 #pragma mark - NSURLConnectionDataDelegate 代理方法
 2 /** 收到服务器回应 */
 3 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
 4     NSLog(@"didReceiveResponse");
 5     self.data = [NSMutableData data];
 6 }
 7
 8 /** 接收到的数据,会调用多次,数据被分割接收 */
 9 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
10     NSLog(@"didReceiveData");
11     [self.data appendData:data];
12 }
13
14 /** 接收数据完毕 */
15 - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
16     NSLog(@"connectionDidFinishLoading");
17     [self dealWithResponseData:self.data];
18 }

3.使用post请求

 1 #pragma mark - post
 2 - (void) testPost {
 3     NSString *requestStr = [NSString stringWithFormat:@"http://192.168.0.21:8080/MyTestServer/login"];
 4     NSURL *url = [NSURL URLWithString:requestStr];
 5
 6     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
 7     request.timeoutInterval = 5;
 8
 9     // 设置为post方式请求
10     request.HTTPMethod = @"POST";
11
12     // 设置请求头
13     [request setValue:@"ios" forHTTPHeaderField:@"User-Agent"];
14
15     // 设置请求体
16     NSString *param = [NSString stringWithFormat:@"user=%@&password=%@", self.userField.text, self.passwordField.text];
17     request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];
18
19     // 发送请求
20     // 使用主线程来处理UI刷新
21     NSOperationQueue *queue = [NSOperationQueue mainQueue];
22     [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
23         [self dealWithResponseData:data];
24     }];
25
26 }

4.设置请求属性

(1)设置超时时限

1     // 使用可变request
2     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
3     // 设置请求超时时间
4     request.timeoutInterval = 5;

4.中文转码

使用UTF8转码

[urlStr stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];

1     NSString *requestStr = [NSString stringWithFormat:@"http://192.168.0.21:8080/MyTestServer/login?user=%@&password=%@", self.userField.text, self.passwordField.text];
2
3     // 由于url不能传送中文,所以需要转码
4     requestStr = [requestStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
时间: 2024-11-08 22:09:53

[iOS 多线程 & 网络 - 2.0] - 发送接收 服务器信息的相关文章

iOS多线程与网络开发之发送接收服务器信息

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源码下载:点我传送 游戏官方下载:http://dwz.cn/RwTjl 游戏视频预览:http://dwz.cn/RzHHd 游戏开发博客:http://dwz.cn/RzJzI 游戏源码传送:http://dwz.cn/Nret1 A.搭建java服务器 使用eclipse.tomcat和struts2框架搭建一个简单的服务器

[iOS 多线程 &amp; 网络 - 3.0] - 在线动画Demo

A.需求 所有数据都从服务器下载 动画列表包含:图片.动画名标题.时长副标题 点击打开动画观看 code source: https://github.com/hellovoidworld/VideoOnlineDemo server source:  https://github.com/hellovoidworld/MyOnlineVideoDemoServer B.实现 1.显示图片和基本信息 服务器端的json信息: { "videos": [ { "name&quo

[iOS 多线程 &amp; 网络 - 1.0] - 多线程概述

A.进程 什么是进程进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过"活动监视器"可以查看Mac系统中所开启的进程 B.线程 主线程.子线程占用内存分别是1M和512K 1.什么是线程1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 比如使用酷狗播放音乐.使用迅雷下载电影,都需要在线程中

iOS 多线程 &amp; 网络 - 4.0 - AFN框架简单使用

A.AFN基本知识 1.概念 AFNetworking 是对NSURLConnection的封装 运行效率没有ASI高(因为ASI基于CFNetwork),但是使用简单 AFN支持ARC B.基本请求使用 1.基本使用 (1)头文件 AFNetworking.h (2)管理者类:AFHTTPRequestOperationManager (3)“GET”方法发送GET请求,使用“POST”方法发送POST请求 (4)使用字典发送参数 (5)block处理请求成功/失败 1 /** 发送 GET/

[iOS 多线程 &amp; 网络 - 2.9] - ASI框架

A.ASI基本知识 1.ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大. ASI的实现基于底层的CFNetwork框架,因此运行效率很高. ASI的github地址 https://github.com/pokeb/asi-http-request ASI的使用参考http://www.cnblogs.com/dotey/archive/2011/05/10/2041966.html http://www.oschina.net/question

[iOS 多线程 &amp; 网络 - 2.7] - NSURLCache

A.基本知识 1.为什么需要缓存? 有时候一个url会请求多次,得到的内容确实一样的 2.缓存的概念 3.缓存数据的过程 当服务器返回数据时,需要做以下步骤(1)使用服务器的数据(比如解析.显示)(2)将服务器的数据缓存到硬盘(沙盒)此时缓存的情况是:内存缓存中有数据,硬盘缓存中有数据.再次请求数据分为两种情况:(1)如果程序并没有被关闭,一直在运行 那么此时内存缓存中有数据,硬盘缓存中有数据.如果此时再次请求数据,直接使用内存缓存中的数据即可(2)如果程序重新启动 那么此时内存缓存已经消失,没

[iOS 多线程 &amp; 网络 - 2.1] - 解析json

A.iOS中json的基本使用 1.解析json数据 (1)json反序列化 对象{}格式 {key : value, key : value,...} 的键值对的结构可以反序列化为OC中的NSDictionary数组[]格式 ["java","javascript","vb",...]可以反序列化为OC中的NSArray 提示JSON的数据格式与OC中的快速包装方法非常类似JSON的数据格式同样支持嵌套 (2)json工具 从iOS 5开始,使

[iOS 多线程 &amp; 网络 - 2.6] - 使用POST上传JSON数据 &amp; 多值参数

A.上传JSON 1.思路: 必须使用POST方法才能上传大量JSON数据 设置请求头:设置Content-Type 设置请求体,JSON实际相当于字典,可以用NSDictionary NSJSONSerialization把字典数据转换成JSON二进制 2.实现 1 // 2 // ViewController.m 3 // PostJsonDemo 4 // 5 // Created by hellovoidworld on 15/1/28. 6 // Copyright (c) 2015年

[iOS 多线程 &amp; 网络 - 2.10] - ASI框架下载文件

A.ASI框架中的下载 1.实现步骤 在实际的开发中如果要使用asi框架来下载服务器上的文件,只需要执行下面简单的几个步骤即可. (1)创建请求对象:(2)设置下载文件保存的路径:(3)发送下载文件的网络请求(异步).按照上面的几个步骤执行,程序会自动开启异步线程,一点一点的把数据写入到指定的文件路径,而且不论是下载多大的文件都不会占用大量的内存空间. ASI框架是基于底层的cfnoteworking的,性能很好.当然也可以设置block,或者是监听下载的进度. 自动会使用“边下边写” 使用进度