iOS网络通信http之NSURLConnection

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

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

1、异步请求

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

1)sendAsynchronousRequest

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

  1. - (void)httpAsynchronousRequest{
  2.  
  3. NSURL *url = [NSURL URLWithString:@"http://url"];
  4.  
  5. NSString *post=@"postData";
  6.  
  7. NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
  8.  
  9. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
  10. [request setHTTPMethod:@"POST"];
  11. [request setHTTPBody:postData];
  12. [request setTimeoutInterval:10.0];
  13.  
  14. NSOperationQueue *queue = [[NSOperationQueue alloc]init];
  15. [NSURLConnection sendAsynchronousRequest:request
  16. queue:queue
  17. completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
  18. if (error) {
  19. NSLog(@"Httperror:%@%d", error.localizedDescription,error.code);
  20. }else{
  21.  
  22. NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode];
  23.  
  24. NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  25.  
  26. NSLog(@"HttpResponseCode:%d", responseCode);
  27. NSLog(@"HttpResponseBody %@",responseString);
  28. }
  29. }];
  30.  
  31. }

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

2)connectionWithRequest

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

  1. - (void)httpConnectionWithRequest{
  2.  
  3. NSString *URLPath = [NSString stringWithFormat:@"http://url"];
  4. NSURL *URL = [NSURL URLWithString:URLPath];
  5. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
  6. [NSURLConnection connectionWithRequest:request delegate:self];
  7.  
  8. }
  9.  
  10. - (void)connection:(NSURLConnection *)theConnection didReceiveResponse:(NSURLResponse *)response
  11. {
  12.  
  13. NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode];
  14. NSLog(@"response length=%lld statecode%d", [response expectedContentLength],responseCode);
  15. }
  16.  
  17. // A delegate method called by the NSURLConnection as data arrives. The
  18. // response data for a POST is only for useful for debugging purposes,
  19. // so we just drop it on the floor.
  20. - (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)data
  21. {
  22. if (mData == nil) {
  23. mData = [[NSMutableData alloc] initWithData:data];
  24. } else {
  25. [mData appendData:data];
  26. }
  27. NSLog(@"response connection");
  28. }
  29.  
  30. // A delegate method called by the NSURLConnection if the connection fails.
  31. // We shut down the connection and display the failure. Production quality code
  32. // would either display or log the actual error.
  33. - (void)connection:(NSURLConnection *)theConnection didFailWithError:(NSError *)error
  34. {
  35.  
  36. NSLog(@"response error%@", [error localizedFailureReason]);
  37. }
  38.  
  39. // A delegate method called by the NSURLConnection when the connection has been
  40. // done successfully. We shut down the connection with a nil status, which
  41. // causes the image to be displayed.
  42. - (void)connectionDidFinishLoading:(NSURLConnection *)theConnection
  43. {
  44. NSString *responseString = [[NSString alloc] initWithData:mData encoding:NSUTF8StringEncoding];
  45. NSLog(@"response body%@", responseString);
  46. }

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

需要实现的方法:

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

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

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

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

3、接收数据

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

4、数据接收完毕

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

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

  1. 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、同步请求

同步请求数据方法如下:

  1. - (void)httpSynchronousRequest{
  2.  
  3. NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]];
  4. NSURLResponse * response = nil;
  5. NSError * error = nil;
  6. NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest
  7. returningResponse:&response
  8. error:&error];
  9.  
  10. if (error == nil)
  11. {
  12. // 处理数据
  13. }
  14. }

初识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

iOS网络通信http之NSURLConnection的更多相关文章

  1. iOS学习笔记(八)——iOS网络通信http之NSURLConnection

    转自:http://blog.csdn.net/xyz_lmn/article/details/8968182 移动互联网时代,网络通信已是手机终端必不可少的功能.我们的应用中也必不可少的使用了网络通 ...

  2. 【转】iOS学习笔记(八)——iOS网络通信http之NSURLConnection

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

  3. iOS开发网络篇—NSURLConnection基本使用

    iOS开发网络篇—NSURLConnection基本使用 一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据 ...

  4. iOS网络通信类库

    iOS网络通信类库 iOS网络通信类库:ASIHTTPRequest,AFNetworking,MKNetWorkKIt. ASIHTTPRequest在ios5.0之后就不在维护了,所以之后主要就是 ...

  5. iOS之数据请求NSURLConnection

    iOS之数据请求NSURLConnection NSString *lcsUrl = @"http://192.168.1.1:8080/lcsUrl"; //假设网址中有汉字.须 ...

  6. iOS开发网络篇—NSURLConnection基本使用(一)

      一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法.请求头.请求体.. ...

  7. iOS 网络编程:NSURLConnection

    1 简介 1.1 概念 NSURLConnection类似NSURLSession,都是进行网络数据传输的.其中NSURLSession是NSURLConnection的替代版本,目前IOS9.0几乎 ...

  8. 关于IOS网络通信的学习

    最近由于需要在看关于网络通信方面的知识,所以在网上找了找关于网络解释方面的知识.找了半天没有找到一篇能详细解释通讯流程的,心里忍不住就万马奔腾了.没办法,谁让自己想学呢!于是又找了找,觉得没有满意的. ...

  9. iOS网络-01-NSURLRequest与NSURLConnection

    NSURLRequest NSURLRequest封装了一次网络请求所需要的数据,主要封装了以下信息: 请求路径(URL) 请求方法(GET或POST) 请求头 请求体 超时参数 NSURLReque ...

随机推荐

  1. signalR例子

    不用找了,比较全的signalR例子已经为你准备好了.   这几天想着将一个winform的工具上线到web上,因为对时时性的要求比较高,找朋友咨询了一下推荐了SignlarR 框架,比较强大.昨天才 ...

  2. 利用webBrowser获取框架内Html页面内容

    原文:利用webBrowser获取框架内Html页面内容 利用webBrowser获取页面比较简单,MSDN下有示例,在这里不必多说. 可是一些 HTML 文档由“框架”构成,或可以存放它们自己独特 ...

  3. 解决OUTLOOK 533错误问题

    OutLook中“553 sorry, that domain isn‘t in my list of allowed rcpthosts (#5.7.1)”,无法发送邮件错误,解决方法 最近我在给徐 ...

  4. ArcEngine下纵断面图的绘制

    我是採用Dev控件中的画图控件来绘制的纵断面图,以下主要来介绍下输电线路选址以及纵断面图的实时绘制的实现流程. 一.关于输电线路的选址,首先要准备好基础地理数据,包含选线区的DOM,DEM,DLG以及 ...

  5. Jquery页面中添加键盘按键事件,如ESC事件

    $(document).keydown(function(event){ if(event.keyCode == 38 || event.keyCode == 104){ i--; if(i<= ...

  6. PHP 以POST方式提交XML、获取XML,最后解析XML

    以POST方式提交XML // Do a POST $data="<?xml version='1.0' encoding='UTF-8'?> <TypeRsp> & ...

  7. [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)

    原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...

  8. linux学习书籍

    linux学习书籍推荐 网上看到的,做个标记.没研究过,仅供参考  linux编程学习   inux 学习书目推荐 Linux基础 1.<Linux与Unix Shell 编程指南> C语 ...

  9. 依据道路的shape获得high_cross和low_cross

    如图所看到的:怎样依据提供的道路的shape file获得该路的high cross和low cross 所谓的high cross就是图中的king st这条路,low cross是Gravers ...

  10. 【Web.xml配置具体解释之context-param 】

    转自:http://blog.csdn.net/liaoxiaohua1981/article/details/6759206 格式定义: [html] view plaincopy <cont ...