ios网络编程学习
//网络访问获取数据
//定义一个UIWebView属性,用来展示数据
@property (strong, nonatomic) IBOutlet UIWebView *myWebView; //....... //使用NSURLConnection发送异步请求获取数据
- (void)getData:(id)sender{
//访问的网站地址
NSString *str = @"http://www.apple.com/";
//实例化NSURL对象
NSURL *url = [NSURL URLWithString:str];
//实例化NSURLRequest对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//实例化操作队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //发送异步请求
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:
^(NSURLResponse *response, NSData *data, NSError *error) {
//获得网络抓取的数据
if ([data length] > 0 && error == nil){
//将NSData转换为NSString
NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
//使用UIWebView显示网页
[self.myWebView loadHTMLString:html baseURL:nil];
NSLog(@"html = %@", html);
}
}];
} /*使用NSUrlConnection发送同步请求获得数据
使用同步请求的时候,最好在单独的一个线程中进行,
这样可以避免程序阻塞
*/
- (void)getDataTwo:(id)sender{
//全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //异步并行队列,开辟一个新线程
dispatch_async(queue, ^{
NSURL *url = [NSURL URLWithString:@"http://www.apple.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLResponse *response;
NSError *error; //NSURLConnection发送同步请求,获得数据
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; //判断结果
if ([data length] > 0 && error == nil){
NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"html = %@", html);
}
});
}
/**
* 使用NSMutableURLRequest向服务器发送POST请求获取数据
*/
- (void)getDataThree:(id)sender{
//创建一个线程
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//执行异步任务
dispatch_async(queue, ^{
//获取新浪的天气预报信息网址
//http://php.weather.sina.com.cn/xml.php?city=%B1%B1%BE%A9&password=DJOYnieT8234jlsK&day=0 //在block中从网络获取数据
NSString *str = @"http://php.weather.sina.com.cn/xml.php";
//创建NSURL对象
NSURL *url = [NSURL URLWithString:str];
//可变URL请求
NSMutableURLRequest *mRequest = [[NSMutableURLRequest alloc] init];
//为请求设置URL
[mRequest setURL:url];
//设置请求超时时间
[mRequest setTimeoutInterval:10];
//设置请求方法为post
[mRequest setHTTPMethod:@"POST"];
//body内容
NSString *body = @"city=%B1%B1%BE%A9&password=DJOYnieT8234jlsK&day=0";
//设置body
[mRequest setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]]; //获得响应
NSURLResponse *response;
NSError *error;
//获得返回数据
NSData *data = [NSURLConnection sendSynchronousRequest:mRequest returningResponse:&response error:&error];
//将NSData转换成字符串
NSString *content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; //使用UIWebView加载数据
[self.myWebView loadHTMLString:content baseURL:nil];
//输出结果
NSLog(@"content = %@", content); });
}
数据解析
在网络编程中,从服务器获取的数据格式大致分为两种:JSON和XML。其中JSON作为一种轻量级的数据交换格式,正在逐步取代XML, 成为网络数据的通用格式。
测试列子:调用一个天气预报的API, 地址是:http://m.weather.com.cn/data/101010100.html
/**
* 使用系统自带库NSJSONSerialization解析json数据
访问http://m.weather.com.cn/data/101010100.html ,返回结果为:
{"weatherinfo":{"city":"北京","city_en":"beijing","date_y":"2014年3月4日","date":"","week":"星期二","fchh":"11","cityid":"101010100","temp1":"8℃~-3℃","temp2":"8℃~-3℃","temp3":"7℃~-3℃","temp4":"8℃~-1℃","temp5":"10℃~1℃","temp6":"10℃~2℃","tempF1":"46.4℉~26.6℉","tempF2":"46.4℉~26.6℉","tempF3":"44.6℉~26.6℉","tempF4":"46.4℉~30.2℉","tempF5":"50℉~33.8℉","tempF6":"50℉~35.6℉","weather1":"晴","weather2":"晴","weather3":"晴","weather4":"晴转多云","weather5":"多云","weather6":"多云","img1":"0","img2":"99","img3":"0","img4":"99","img5":"0","img6":"99","img7":"0","img8":"1","img9":"1","img10":"99","img11":"1","img12":"99","img_single":"0","img_title1":"晴","img_title2":"晴","img_title3":"晴","img_title4":"晴","img_title5":"晴","img_title6":"晴","img_title7":"晴","img_title8":"多云","img_title9":"多云","img_title10":"多云","img_title11":"多云","img_title12":"多云","img_title_single":"晴","wind1":"北风4-5级转微风","wind2":"微风","wind3":"微风","wind4":"微风","wind5":"微风","wind6":"微风","fx1":"北风","fx2":"微风","fl1":"4-5级转小于3级","fl2":"小于3级","fl3":"小于3级","fl4":"小于3级","fl5":"小于3级","fl6":"小于3级","index":"寒冷","index_d":"天气寒冷,建议着厚羽绒服、毛皮大衣加厚毛衣等隆冬服装。年老体弱者尤其要注意保暖防冻。","index48":"冷","index48_d":"天气冷,建议着棉服、羽绒服、皮夹克加羊毛衫等冬季服装。年老体弱者宜着厚棉衣、冬大衣或厚羽绒服。","index_uv":"中等","index48_uv":"中等","index_xc":"较适宜","index_tr":"一般","index_co":"较舒适","st1":"7","st2":"-3","st3":"8","st4":"0","st5":"7","st6":"-1","index_cl":"较不宜","index_ls":"基本适宜","index_ag":"易发"}}
*/
- (void)getWeatherData:(id)sender{
NSURL *url = [NSURL URLWithString:@"http://m.weather.com.cn/data/101010100.html"];
NSURLRequest *requst = [NSURLRequest requestWithURL:url]; //发送异步请求
[NSURLConnection sendAsynchronousRequest:requst queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { if ([data length] > 0 && error == nil){
//将NSData转换成NSDictionary
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
//结果为字典中有字典,获得key为weatherinfo的字典
NSDictionary *dic2 = [dic objectForKey:@"weatherinfo"];
//遍历字典
for (NSString *key in dic2) {
NSLog(@"%@:%@", key, [dic2 objectForKey:key]);
}
}
}];
}
XML解析可以通过苹果自带的API -> NSXMLParser和其代理类NSXMLParserDelegate。
NSXMLParseDelegate代理类中有一组方法用来检测文档的读取状态,例如,文档开始、文档结束、元素开始、元素结束、内容开始等;
解析XML数据的基本思路是,在元素开始时创建一个空对象,找到内容时,读取内容并为对象的属性赋值,元素结束时将对象添加到集合中。
示例代码:
//创建一个Customer类
@interface Customer : NSObject @property (nonatomic, assign) int cid; //客户id
@property (nonatomic, retain) NSString *name;//客户姓名
@property (nonatomic, assign) int age; //客户年龄 @end
//先定义4个属性
@property (nonatomic, retain) Customer *customer; //客户实例
@property (nonatomic, retain) NSXMLParser *parser; //xml解析器
@property (nonatomic, retain) NSMutableArray *array; //可变数组
@property (nonatomic, strong) NSString *currrentElement; //当前元素 //初始化方法
- (void)initParser{
//初始化数组,用来容纳客户对象
self.array = [NSMutableArray arrayWithCapacity:10];
//获得客户XML文件的URL路径
NSString *str = [[NSBundle mainBundle] pathForResource:@"customers" ofType:@"xml"];
//将客户XML转换成NSData
NSData *data = [[NSData alloc] initWithContentsOfFile:str];
//实例化XML解析器
self.parser = [[NSXMLParser alloc] initWithData:data];
//设置代理
self.parser.delegate = self;
} /**
* 实现协议代理方法
*/
//读文档开始
- (void)parserDidStartDocument:(NSXMLParser *)parser{
NSLog(@"parserDidStartDocument...");
} //读文档结束
- (void)parserDidEndDocument:(NSXMLParser *)parser{
NSLog(@"parserDidEndDocument....");
} //读元素开始
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
NSLog(@"didStartElement...");
self.currrentElement = elementName;
if ([self.currrentElement isEqualToString:@"customer"]){
self.customer = [[Customer alloc] init];
}
} //找到内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
NSLog(@"foundCharacters...."); if ([self.currrentElement isEqualToString:@"id"]){
int cid = [string integerValue];
[self.customer setCid:cid];
}
else if ([self.currrentElement isEqualToString:@"name"]){
[self.customer setName:string];
}
else if ([self.currrentElement isEqualToString:@"age"]){
[self.customer setAge:[string integerValue]];
}
} //读元素结束
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
NSLog(@"didEndElement..."); if ([elementName isEqualToString:@"customer"]){
[self.array addObject:self.customer];
}
self.currrentElement = nil;
} //开始解析方法
- (void)parse:(id)sender{
//删除数组中的所有数据
[self.array removeAllObjects];
//开始解析
[self.parser parse];
//获得数组大小
NSInteger count = [self.array count];
}
ios网络编程学习的更多相关文章
- iOS网络编程模型
iOS网络编程层次结构也分为三层: Cocoa层:NSURL,Bonjour,Game Kit,WebKit Core Foundation层:基于 C 的 CFNetwork 和 CFNetServ ...
- [转]Windows网络编程学习-面向连接的编程方式
直接附上原文链接:windows 网络编程学习-面向连接的编程方式
- IOS网络编程——第三方类库
IOS网络编程——第三方类库 目录 概述 ASIHttpRequest AFNetworking 其他 概述 ASIHttpRequest AFNetworking 其他
- IOS网络编程:HTTP
IOS网络编程:HTTP HTTP定义了一种在服务器和客户端之间传递数据的途径. URL定义了一种唯一标示资源在网络中位置的途径. REQUESTS 和 RESPONSES: 客户端先建立一个TCP连 ...
- iOS网络编程笔记——Socket编程
一.什么是Socket通信: Socket是网络上的两个程序,通过一个双向的通信连接,实现数据的交换.这个双向连路的一端称为socket.socket通常用来实现客户方和服务方的连接.socket是T ...
- C,C++网络编程学习简明指南
C,C++网络编程学习简明指南 1. 扎实的C,C++基础知识 参考资料<C程序设计>,<C++ primer>. 2. TCP/IP协议 经典书是:W.Richard Ste ...
- 转 网络编程学习笔记一:Socket编程
题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...
- Windows平台VC++ 6.0 下的网络编程学习 - 简单的测试winsock.h头文件
最近学习数据结构和算法学得有点累了(貌似也没那么累...)...找了本网络编程翻了翻当做打一个小基础吧,打算一边继续学习数据结构一边也看看网络编程相关的... 简单的第一次尝试,就大致梳理一下看书+自 ...
- Linux C++ 网络编程学习系列(1)——端口复用实现
Linux C++ 网络编程学习系列(1)--端口复用实现 源码地址:https://github.com/whuwzp/linuxc/tree/master/portreuse 源码说明: serv ...
随机推荐
- Canny边缘检测算法原理及C语言实现详解
Canny算子是John Canny在1986年提出的,那年老大爷才28岁,该文章发表在PAMI顶级期刊上的(1986. A computational approach to edge detect ...
- JavaScript客户端MVC 框架综述
简介 15 年前,许多人都使用 Perl 和 ColdFusion 之类的工具构建网站.我们经常编写可以在页面顶部查询数据库的脚本,对数据应用必要的转换,以及在同一个脚本底部显示数据.这类架构适合于向 ...
- ASP.Net中防止页面刷新重复提交的几种方法
[摘要] 目前很多网站都要提交页面插入或更新数据库,比如留言本,一个用户提交留言后,如果按F5,就会重新提交一遍留言,导致数据库出现两条一模一样的留言,本文介绍了几种防止页面刷新,导致重复提交数据的方 ...
- C# winform OpenFileDialog MessageBox
1.弹出窗体选择本地文件-OpenFileDialog OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Tit ...
- lua学习之table类型
关系表类型,这是一个很强大的类型.我们可以把这个类型看作是一个数组.只是 C语言的数组,只能用正整数来作索引: 在Lua中,你可以用任意类型的值来作数组的索引,但这个值不能是 nil.同样,在C语言中 ...
- 走进异步世界:EnyimMemcached异步化改造引起的内存泄漏
6月30日我们发布了异步化改造后的博客程序之后,出现了高内存.高CPU.高线程数的不理想情况. 经过一周的追查,终于水落日出——引起不理想情况的根源是我们修改过的EnyimMemcached代码存在内 ...
- C# POST Https请求的一些坑
写在前面: 从上次,跟合作方的站点对接开始就产生了这个问题,当时用C#进行POST提交,总是会出现问题,找了很久发现对方的站点居然是TLS 1.2 的. 正文: 然而,在.NET FrameWork ...
- 背水一战 Windows 10 (1) - C# 6.0 新特性
[源码下载] 背水一战 Windows 10 (1) - C# 6.0 新特性 作者:webabcd 介绍背水一战 Windows 10 之 C# 6.0 新特性 介绍 C# 6.0 的新特性 示例1 ...
- 不可或缺 Windows Native (17) - C++: 类与对象
[源码下载] 不可或缺 Windows Native (17) - C++: 类与对象 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 类与对象 示例1.类的设计CppE ...
- 基于TCP和多线程实现无线鼠标键盘-Socket(1)
把手机作为移动鼠标.键盘使用非常方便,本文将实现这一功能.该应用分为两部分:Windows服务端和Android客户端. 本文源代码的下载地址:http://download.csdn.net/det ...