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请求
 ().使用同步方法发送get请求(不常用)
/** 发送get消息 */
- (void) testGet {
NSString *requestStr = [NSString stringWithFormat:@"http://192.168.0.21:8080/MyTestServer/login?user=%@&password=%@", self.userField.text, self.passwordField.text]; NSURL *url = [NSURL URLWithString:requestStr]; // 默认就是get请求
NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 使用同步方法发送请求
[self sendSynRequest:request];
} /** 同步发送请求 */
- (void) sendSynRequest:(NSURLRequest *) request {
// 同步发送信息
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; [self dealWithResponseData:data];
} /** 处理返回数据 */
- (void) dealWithResponseData:(NSData *) data {
// 解析数据
if (data) { // 得到返回数据
// 解除屏幕锁
[MBProgressHUD hideHUD]; // 解析json数据
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; // 处理返回的数据
NSString *result = dict[@"success"];
if (result) {
[MBProgressHUD showSuccess:result];
} else {
result = dict[@"error"];
if (result) {
[MBProgressHUD showError:result];
}
}
} else {
[MBProgressHUD showError:@"网络繁忙,请稍后再试~"];
}
}
 
(2).使用异步方法发送get请求
 /** 异步发送请求 */
- (void) sendAsynRequest:(NSURLRequest *) request {
NSOperationQueue *queue = [NSOperationQueue mainQueue];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { [self dealWithResponseData:data];
}];
}
 
2.使用NSURLConnectionDataDelegate代理发送异步请求
(1)遵守协议
 @interface ViewController () <NSURLConnectionDataDelegate>
 
(2)设置代理、发送请求
 /** 使用start & 代理发送、处理异步请求 */
- (void) sendAsynRequestWithDelegate:(NSURLRequest *) request {
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
[connection start];
}
 
(3)实现代理方法
 #pragma mark - NSURLConnectionDataDelegate 代理方法
/** 收到服务器回应 */
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSLog(@"didReceiveResponse");
self.data = [NSMutableData data];
} /** 接收到的数据,会调用多次,数据被分割接收 */
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
NSLog(@"didReceiveData");
[self.data appendData:data];
} /** 接收数据完毕 */
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSLog(@"connectionDidFinishLoading");
[self dealWithResponseData:self.data];
}
 
 
3.使用post请求
 #pragma mark - post
- (void) testPost {
NSString *requestStr = [NSString stringWithFormat:@"http://192.168.0.21:8080/MyTestServer/login"];
NSURL *url = [NSURL URLWithString:requestStr]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.timeoutInterval = ; // 设置为post方式请求
request.HTTPMethod = @"POST"; // 设置请求头
[request setValue:@"ios" forHTTPHeaderField:@"User-Agent"]; // 设置请求体
NSString *param = [NSString stringWithFormat:@"user=%@&password=%@", self.userField.text, self.passwordField.text];
request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding]; // 发送请求
// 使用主线程来处理UI刷新
NSOperationQueue *queue = [NSOperationQueue mainQueue];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
[self dealWithResponseData:data];
}]; }
 
 
4.设置请求属性
(1)设置超时时限
     // 使用可变request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 设置请求超时时间
request.timeoutInterval = ;
 
4.中文转码
使用UTF8转码
[urlStr stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
     NSString *requestStr = [NSString stringWithFormat:@"http://192.168.0.21:8080/MyTestServer/login?user=%@&password=%@", self.userField.text, self.passwordField.text];

     // 由于url不能传送中文,所以需要转码
requestStr = [requestStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
 
 
 
 

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

  1. [iOS 多线程 & 网络 - 3.0] - 在线动画Demo

    A.需求 所有数据都从服务器下载 动画列表包含:图片.动画名标题.时长副标题 点击打开动画观看   code source: https://github.com/hellovoidworld/Vid ...

  2. iOS多线程与网络开发之发送接收server信息

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. (1).使用同步方法发送get请求(不经常使用) 2 /** 发送get消息 */ 3 - (void) testGet { 4 NSString *r ...

  3. [iOS 多线程 & 网络 - 1.0] - 多线程概述

    A.进程 什么是进程进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过"活 ...

  4. [iOS 多线程 & 网络 - 4.0] - AFN框架简单使用

    A.AFN基本知识 1.概念 AFNetworking 是对NSURLConnection的封装 运行效率没有ASI高(因为ASI基于CFNetwork),但是使用简单 AFN支持ARC     B. ...

  5. [iOS 多线程 & 网络 - 2.4] - 大文件下载 (边下边写/暂停恢复下载/压缩解压zip/多线程下载)

    A.需求 边下边写入硬盘 显示下载进度 暂停/恢复 下载 解压文件 多线程下载   B.基本知识 1.小文件下载 如果文件比较小,下载方式会比较多直接用NSData的+ (id)dataWithCon ...

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

    A.ASI框架中的下载 1.实现步骤 在实际的开发中如果要使用asi框架来下载服务器上的文件,只需要执行下面简单的几个步骤即可. (1)创建请求对象:(2)设置下载文件保存的路径:(3)发送下载文件的 ...

  7. [iOS 多线程 & 网络 - 2.9] - ASI框架

    A.ASI基本知识 1.ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大. ASI的实现基于底层的CFNetwork框架,因此运行效率很高. ASI的g ...

  8. [iOS 多线程 & 网络 - 2.7] - NSURLCache

    A.基本知识 1.为什么需要缓存?   有时候一个url会请求多次,得到的内容确实一样的   2.缓存的概念     3.缓存数据的过程     当服务器返回数据时,需要做以下步骤(1)使用服务器的数 ...

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

    A.上传JSON 1.思路: 必须使用POST方法才能上传大量JSON数据 设置请求头:设置Content-Type 设置请求体,JSON实际相当于字典,可以用NSDictionary NSJSONS ...

随机推荐

  1. heatmap.2

    heatmap.2 {gplots} R Documentation Enhanced Heat Map Description A heat map is a false color image ( ...

  2. chrome下float元素下input选中内容bug

    今天在写一个小demo的时候,发现chrome下一个很奇怪的bug. 我的代码如下: <!DOCTYPE html> <html lang="en"> &l ...

  3. 如何过滤 adb logcat 输出

    对原作者表示感谢,转自博客:http://www.otechu.me/zh/2011/12/filtering-adb-logcat-output/ 本文介绍如何在 shell 命令行中过滤 adb ...

  4. iOS开发:在Xcode中用Pods管理第三方库

    之前写了一篇 iOS开发:在Swift中调用oc库 ,今天记录一下如何用Pods的方式来管理第三方库,包括Swift/Object-C的库. 在这之前请先查阅Guides.CocoaPods如何使用的 ...

  5. GridView CommandArgument 绑定多个参数

    我们在使用GridView的时候 有时会需要绑定多个参数 <asp:GridView ID="gvwVoxListAll" runat="server"  ...

  6. [cocos2d-x·解Bug]关于cocos2d-x游戏在android锁屏状态下播放Bgm的解决方法

    最近<宠物联萌>在三星App上发布遇到一个问题:如果用户在锁定屏幕时解锁解到一半时取消解锁,这时用cocos2d-x开发的游戏就会出现游戏Bgm会恢复播放,但手机屏幕仍然是锁屏状态的Bug ...

  7. Builder模式在Java中的应用(转)

    在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Build ...

  8. LeetCode中有技巧的题需要面试前记得的

    https://leetcode.com/problems/insert-interval/ http://www.cnblogs.com/yxzfscg/p/4459173.html https:/ ...

  9. 给table中某一列的文字右对齐

    一般来说,没写过jquery的前端人员,肯定是定义一个class,给每一行的那列加上align_r{text-align:right}.这是很麻烦的. 所以用jquery来写,可以$("ta ...

  10. 【转】使用NetBeans和Eclipse开发PHP应用程序

    [51CTO独家特稿]各位用户如果单独看NetBeans和Eclipse的市场占有率,你可能会认为使用其中任何一种IDE开发PHP应用程序都没有 问题,例如: 1.NetBeans:一款开源的集成开发 ...