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

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

A.搭建java服务器

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

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

2.配置JDK和tomcat系统变量

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

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

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

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

server source: https://github.com/hellovoidworld/MyOnlineVideoDemoServer

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 {4NSString *requestStr = [NSString stringWithFormat:@"http://192.168.0.21:8080/MyTestServer/login?user=%@&passWord=%@", self.userField.text, self.passwordField.text];56NSURL *url =[NSURL URLWithString:requestStr];78//默认就是get请求9NSURLRequest *request =[NSURLRequest requestWithURL:url];1011//使用同步方法发送请求12[self sendSynRequest:request];13}1415/** 同步发送请求*/16- (void) sendSynRequest:(NSURLRequest *) request {17//同步发送信息18NSData *data =[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];1920[self dealWithResponseData:data];21}2223/** 处理返回数据*/24- (void) dealWithResponseData:(NSData *) data {25//解析数据26if(data) {//得到返回数据27//解除屏幕锁28[MBProgressHUD hideHUD];2930//解析json数据31NSDictionary *dict =[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];3233//处理返回的数据34NSString *result = dict[@"success"];35if(result) {36[MBProgressHUD showSuccess:result];37}else{38result = dict[@"error"];39if(result) {40[MBProgressHUD showError:result];41}42}43}else{44[MBProgressHUD showError:@"网络繁忙,请稍后再试~"];45}46}

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

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

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

(1)遵守协议

1@interfaceViewController () <NSURLConnectionDataDelegate>

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

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

(3)实现代理方法

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

3.使用post请求

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

4.设置请求属性

(1)设置超时时限

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

4.中文转码

使用UTF8转码

[urlStr stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];

1NSString *requestStr = [NSString stringWithFormat:@"http://192.168.0.21:8080/MyTestServer/login?user=%@&password=%@", self.userField.text, self.passwordField.text];23//由于url不能传送中文,所以需要转码4requestStr = [requestStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航