zoukankan      html  css  js  c++  java
  • iOS网络通信http之NSURLConnection

    iOS网络通信http之NSURLConnection

    移动互联网时代,网络通信已是手机终端必不可少的功能。我们的应用中也必不可少的使用了网络通信,增强客户端与服务器交互。这一篇提供了使用NSURLConnection实现http通信的方式。

              NSURLConnection提供了异步请求、同步请求两种通信方式。

    1、异步请求

           iOS5.0 SDK NSURLConnection类新增的sendAsynchronousRequest:queue:completionHandler:方法,从而使iOS5支持两种异步请求方式。我们先从新增类开始。

    1)sendAsynchronousRequest

    iOS5.0开始支持sendAsynchronousReques方法,方法使用如下:

    - (void)httpAsynchronousRequest{
    
        NSURL *url = [NSURL URLWithString:@"http://url"];
        
        NSString *post=@"postData";
        
        NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        [request setHTTPMethod:@"POST"];
        [request setHTTPBody:postData];
        [request setTimeoutInterval:10.0];
        
        NSOperationQueue *queue = [[NSOperationQueue alloc]init];
        [NSURLConnection sendAsynchronousRequest:request
                                           queue:queue
                               completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
                                   if (error) {
                                       NSLog(@"Httperror:%@%d", error.localizedDescription,error.code);
                                   }else{
                                       
                                       NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode];
                                       
                                       NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                                       
                                       NSLog(@"HttpResponseCode:%d", responseCode);
                                       NSLog(@"HttpResponseBody %@",responseString);
                                   }
                               }];
    
        
    }
    


          sendAsynchronousReques可以很容易地使用NSURLRequest接收回调,完成http通信。

    2)connectionWithRequest

    iOS2.0就开始支持connectionWithRequest方法,使用如下:

    - (void)httpConnectionWithRequest{
        
        NSString *URLPath = [NSString stringWithFormat:@"http://url"];
        NSURL *URL = [NSURL URLWithString:URLPath];
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
        [NSURLConnection connectionWithRequest:request delegate:self];
        
    }
    
    - (void)connection:(NSURLConnection *)theConnection didReceiveResponse:(NSURLResponse *)response
    {
       
        NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode];
        NSLog(@"response length=%lld  statecode%d", [response expectedContentLength],responseCode);
    }
    
    
    // A delegate method called by the NSURLConnection as data arrives.  The
    // response data for a POST is only for useful for debugging purposes,
    // so we just drop it on the floor.
    - (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)data
    {
        if (mData == nil) {
            mData = [[NSMutableData alloc] initWithData:data];
        } else {
            [mData appendData:data];
        }
        NSLog(@"response connection");
    }
    
    // A delegate method called by the NSURLConnection if the connection fails.
    // We shut down the connection and display the failure.  Production quality code
    // would either display or log the actual error.
    - (void)connection:(NSURLConnection *)theConnection didFailWithError:(NSError *)error
    {
        
        NSLog(@"response error%@", [error localizedFailureReason]);
    }
    
    // A delegate method called by the NSURLConnection when the connection has been
    // done successfully.  We shut down the connection with a nil status, which
    // causes the image to be displayed.
    - (void)connectionDidFinishLoading:(NSURLConnection *)theConnection
    {
        NSString *responseString = [[NSString alloc] initWithData:mData encoding:NSUTF8StringEncoding];
         NSLog(@"response body%@", responseString);
    }
    

       connectionWithRequest需要delegate参数,通过一个delegate来做数据的下载以及Request的接受以及连接状态,此处delegate:self,所以需要本类实现一些方法,并且定义mData做数据的接受。

    需要实现的方法:

     

    1、获取返回状态、包头信息。

     

    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;


    2、连接失败,包含失败。

    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;

     

    3、接收数据

    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;

     

    4、数据接收完毕

    - (void)connectionDidFinishLoading:(NSURLConnection *)connection;

        connectionWithRequest使用起来比较繁琐,而iOS5.0之前用不支持sendAsynchronousRequest。有网友提出了AEURLConnection解决方案。

    AEURLConnection is a simple reimplementation of the API for use on iOS 4. Used properly, it is also guaranteed to be safe against The Deallocation Problem, a thorny threading issue that affects most other networking libraries.

    2、同步请求

    同步请求数据方法如下:

    - (void)httpSynchronousRequest{
        
        NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]];
        NSURLResponse * response = nil;
        NSError * error = nil;
        NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest
                                              returningResponse:&response
                                                          error:&error];
        
        if (error == nil)
        {
            // 处理数据
        }
    }



    初识MemCached

    吹牛

    没接触过MemCached,也没有打算要学习它,本人做web起步晚(有365天这样),近两周来是想了解一下asp.net的缓存和Session的工作原理,但"上错花轿遇到狼",便开始对MemCached产生好感觉,官网上看看其.net客户端,发现都是使用其文本协议现实现,于是突发其想,自己来实现个基于二进制协议的.net客户端(算是给.net打气还是丢脸呢?),并以此实现了asp.net的分布式OutputCache和分布式Session。当然,我实现的未必好,个人能力有限,时间也比较少。

    描述

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。这段落引用自百度百科,MemCached网站是http://memcached.org/,二进制协议的webi是http://code.google.com/p/memcached/wiki/BinaryProtocolRevamped

    正文

    我不想在此随笔就把全部内容写完,因为可能比较多,我会写好的每一篇的链接放到此页面中,做一个小小的系列来讲解:

    MemCached相关下载:点击下载  压缩包包含x86和x64版的Memcached服务端、本人写的memcached管理器(MemCachedManager.exe)、C#实现的memecahced二进制协议调用组件MemCachedLib.dll

    下载包包后,可以直接启动管理器来对memcached服务端的添加、删除、修改、停止等,还可以简单的通过命令与服务端进行交互。

    能提供MemcacheLib的实现代码吗?

    当然能,留着发霉是不好的,后期我会继续维护,如果可能,放到开源服务上(怕是Memcached越来越没人鸟)

    这里是整个解决方案,大家可以下来看看我拙劣的代码,代码有注释,将就一下,周末我再把上面的空白补充。

    MemCached二进制协议请求包详解

    敬请关注

    Memcached二进制协议响应包详解

    敬请关注

    通过MemcachedLib实现自己的缓存提供者

    敬请关注

    通过MemcachedLib实现自己的Session提供者

    敬请关注

     
     
    分类: MemCached
     
    参考:
    http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html#//apple_ref/doc/uid/20001836-BAJEAIEE
    http://codewithchris.com/tutorial-how-to-use-ios-nsurlconnection-by-example/
    http://kelp.phate.org/2011/06/ios-stringwithcontentsofurlnsurlconnect.html
  • 相关阅读:
    duilib中各控件响应的消息类型
    CoInitialize()、CoInitializeEx()和AfxOleInit()区别联系
    Linux下反斜杠号""引发的思考
    人生规划和GTD——“知”、“得”与“合”
    一次失败的面试——IBM电话面试
    Duilib介绍以及各个类的简介
    Linux与Windows中动态链接库的分析与对比
    VC++创建、调用dll的方法步骤
    网络对抗 Exp0 Kali安装 Week1
    2018-2019-1 20165226_20165310_20165315 实验五 通讯协议设计
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3261362.html
Copyright © 2011-2022 走看看