ios http 同步异步请求处理

转自:http://www.cnblogs.com/edisonfeng/p/3830224.html

一、服务端

  1、主要结构:

    

  2、主要代码:

    1)web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
      <servlet-name>LoginServlet</servlet-name><!--lsdkalskdfjasdkfj-->
      <servlet-class>com.wiscom.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>LoginServlet</servlet-name>
      <url-pattern>/LoginServlet</url-pattern>
  </servlet-mapping>
</web-app>

    2)LoginServlet.java

package com.wiscom.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {

  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    response.setContentType("text/html;charset=utf-8");

    request.setCharacterEncoding("utf-8");//设置参数解码类型,必须和页面中一致
    String sName=request.getParameter("name");
    String sPassword=request.getParameter("psw");

    PrintWriter out = response.getWriter();
    if(sName.equals("admin")&&sPassword.equals("admin")){
                out.print(sName+",您已成功登陆!!");
    }else{
            out.print(sName+",用户名密码有误!!");
    }
   }

  public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
      this.doGet(request, response);
  }
}

二、客户端

  1、头文件:NetCenter.h

#import <Foundation/Foundation.h>

@interface NetCenter : NSObject

@property(nonatomic,retain) NSMutableData *receiveData;

@property(nonatomic,assign)int dataPackSerialNo;

- (void)httpGetSyn;

- (void)httpPostSyn;

- (void)httpGetNoSyn;

- (void)httpPostNoSyn;

@end

  2、实现文件:NetCenter.m

#import "NetCenter.h"

@implementation NetCenter

@synthesize receiveData=_receiveData;
@synthesize dataPackSerialNo=_dataPackSerialNo;

- (void)httpGetSyn
{
    NSLog(@"httpGetSyn...");

    /*
    NSString *urlString =url;
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:urlString]];
    [request setHTTPMethod:@"GET"];
    NSHTTPURLResponse* urlResponse = nil;
    NSError *error = [[NSError alloc] init];
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];
    NSMutableString *result = [[NSMutableString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    NSLog(@"The result string is :%@",result);
    */
    //第一步,创建URL
    NSURL *url = [NSURL URLWithString:@"http://10.0.0.96:8080/app_server/LoginServlet?name=admin&psw=admin"];

    //第二步,通过URL创建网络请求
    NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
    //NSURLRequest初始化方法第一个参数:请求访问路径,第二个参数:缓存协议,第三个参数:网络请求超时时间(秒)
    /*
    其中缓存协议是个枚举类型包含:
    NSURLRequestUseProtocolCachePolicy(基础策略)
    NSURLRequestReloadIgnoringLocalCacheData(忽略本地缓存)
    NSURLRequestReturnCacheDataElseLoad(首先使用缓存,如果没有本地缓存,才从原地址下载)
    NSURLRequestReturnCacheDataDontLoad(使用本地缓存,从不下载,如果本地没有缓存,则请求失败,此策略多用于离线操作)
    NSURLRequestReloadIgnoringLocalAndRemoteCacheData(无视任何缓存策略,无论是本地的还是远程的,总是从原地址重新下载)
    NSURLRequestReloadRevalidatingCacheData(如果本地缓存是有效的则不下载,其他任何情况都从原地址重新下载)
    */
    //第三步,连接服务器
    NSData *received = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    NSString *str = [[NSString alloc]initWithData:received encoding:NSUTF8StringEncoding];

    NSLog(@"%@",str);

}

- (void)httpPostSyn
{
    NSLog(@"httpPostSyn...");

    //第一步,创建URL
    NSURL *url = [NSURL URLWithString:@"http://10.0.0.96:8080/app_server/LoginServlet"];

    //第二步,创建请求
    NSString *postStr = [[NSString alloc] initWithFormat:@"name=%@&psw=%@",@"admin",@"admin"];
    NSData *postData = [postStr dataUsingEncoding:NSUTF8StringEncoding];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
    [request setHTTPMethod:@"POST"];//设置请求方式为POST,默认为GET
    [request setHTTPBody:postData];//设置参数

    //第三步,连接服务器
    NSData *received = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    NSString *backStr = [[NSString alloc]initWithData:received encoding:NSUTF8StringEncoding];

    NSLog(@"%@",backStr);
}

- (void)httpGetNoSyn
{
    NSLog(@"httpGetNoSyn...");

    //第一步,创建url
    NSURL *url = [NSURL URLWithString:@"http://10.0.0.96:8080/app_server/LoginServlet?name=admin&psw=admin"];

    //第二步,创建请求
    NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];

    //第三步,连接服务器
    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];

}

- (void)httpPostNoSyn
{
    NSLog(@"httpPostNoSyn...");

    //第一步,创建url
    NSURL *url = [NSURL URLWithString:@"http://10.0.0.96:8080/app_server/LoginServlet"];

    //第二步,创建请求
    NSString *postStr = [[NSString alloc] initWithFormat:@"name=%@&psw=%@",@"admin",@"admin"];
    NSData *postData = [postStr dataUsingEncoding:NSUTF8StringEncoding];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:postData];

    //第三步,连接服务器
    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
}

/*************5、异步请求的代理方法[start]****************/

//接收到服务器回应的时候调用此方法
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
    NSLog(@"%@",[res allHeaderFields]);
    self.receiveData = [NSMutableData data];//数据存储对象的的初始化
    self.dataPackSerialNo=0;
    NSLog(@"收到服务器回应。。。");
}

//接收到服务器传输数据的时候调用,此方法根据数据大小执行若干次
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSLog(@"收到服务器传回的数据包,数据包序号:%d",self.dataPackSerialNo);
    [self.receiveData appendData:data];
    self.dataPackSerialNo+=1;
}

//数据传完之后调用此方法
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"数据传输完成,输出所有数据结果。。。");
    NSString *receiveStr = [[NSString alloc]initWithData:self.receiveData encoding:NSUTF8StringEncoding];
    NSLog(@"%@",receiveStr);
}

//网络请求过程中,出现任何错误(断网,连接超时等)会进入此方法
-(void)connection:(NSURLConnection *)connection
 didFailWithError:(NSError *)error
{
    NSLog(@"网络请求出错:%@",[error localizedDescription]);
}

/*************5、异步请求的代理方法[end]****************/

@end

  3、调用

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    NetCenter *netCenter=[[NetCenter alloc]init];

    /*****************同步请求****************/
    //[netCenter httpGetSyn];
    //[netCenter httpPostSyn];

    /*****************异步请求****************/
    //[netCenter httpGetNoSyn];
    [netCenter httpPostNoSyn];

    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}  

三、测试

  1、同步get

  

  2、同步post

  

  3、异步get

  

  4、异步post

  

三、扩展

  1、http和https

    http://www.cnblogs.com/stan0714/archive/2012/03/21/2409872.html

  2、ios网络编程理论与实例

    http://blog.csdn.net/hgy2011/article/details/8676084

时间: 2024-09-17 02:36:28

ios http 同步异步请求处理的相关文章

iOS多线程——同步异步串行并行

串行并行异步同步的概念很容易让人混淆,关于这几个概念我在第一篇GCD中有解释,但是还不够清晰,所以这里重写一篇博客专门对这几个概念进行区分: 先说一下队列和任务: (1)队列分为串行和并行,任务的执行分为同步和异步,异步是多线程的代名词,异步在实际引用中会开启新的线程,执行耗时操作. (2)队列只是负责任务的调度,而不负责任务的执行,任务是在线程中执行. 以上两点对了解串行.并行.同步.异步非常重要! 再说一下队列和任务的特点: (1)串行队列:任务按照顺序被调度,前一个任务不执行完毕,队列不会

iOS:转载:同步、异步、并行、串行的详解

理解 iOS 开发中 GCD 相关的同步(synchronization)\ 异步(asynchronization),串行(serial)\ 并行(concurrency)概念 2014年11月21日iOSasynchronization.concurrency.GCD.iOS.serial.synchronization.串行.同步.并发.异步 iOS 开发过程中,常常需要用到多线程技术,GCD 是常用的实现多线程的技术,其因简洁底层而备受欢迎. GCD 技术中,同步(synchroniza

IOS之同步请求、异步请求、GET请求、POST请求(转)

1.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, 2.异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行 3.GET请求,将参数直接写在访问路径上.操作简单,不过容易被外界看到,安全性不高,地址最多255字节: 4.POST请求,将参数放到body里面.POST请求操作相对复杂,需要将参数和地址分开,不过安全性高,参数放在body里面,不易被捕获. 001 1.  

【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例(转载)

(1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时间的任务 /** * 因为是异步,所以开通了子线程,但是因为是串行队列,所以只需要开通1个子线程(2),它们在子线程中顺序执行.最常用. */ -(void)gcdDemo1{ dispatch_queue_t q1=dispatch_queue_create("com.hellocation.gcdDemo", DISPATCH_QUEUE_SERIAL); for

iOS NSURLConnection和异步网络请求

在日常应用中,我们往往使用AFNetworking等第三方库来实现网络请求部分.这篇文章会简要地介绍一下如何使用NSURLConnection来进行异步的网络请求. 我们先看一个小demo - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSString *urlStr = @"http://www.baidu.c

1. 关于GCD的使用(串并行队列和同步异步函数的问题)

/*------------------------------ GCD使用 1.队列和任务------------------------------------------*/ 重点:1."串行队列"? "并发队列"? 2.block? { 1.GCD(Grand Central Dispatch) ---- '牛逼的中枢调度器'! // C语言框架 / 自动管理线程的生命周期(创建/释放) 推出GCD的目的:取代NSThread! 为"多核"

理解同步异步与阻塞非阻塞

本篇文章我准本从三个大方面来解释下同步异步.阻塞非阻塞的知识,第一个方面主要是说下,到底什么是同步异步.阻塞非阻塞:第二个方面主要是解释下在I/O场景下,同步异步阻塞非阻塞又是怎么定义的,第三个方面介绍下在unix下同步异步又有哪些阻塞非阻塞IO. 1.同步异步与阻塞非阻塞 首先从大的方面来说,"阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答. 1).同步与异步 同步和异步关注的是消

同步/异步与阻塞/非阻塞

一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如sin isdigit等).但是一般而言,我们在说同步.异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务.最常见的例子就是 SendMessage.该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回.当对方处理完毕以后,该函数才把消息处理函数所返回的值返回给调用者. B.

理解阻塞非阻塞与同步异步

作者:严肃链接:https://www.zhihu.com/question/19732473/answer/20851256来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. "阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答.1.同步与异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous c