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 ...
随机推荐
- ”Connection reset by peer“引发的思考
闲来无事,把之前写的一个游戏服务器框架(<一个java页游服务器框架>),部署到阿里云服务器上,测试运行了下,结果看到后台log中打印出了“Connection reset by peer ...
- Windows Azure Cloud Service (37) 浅谈Cloud Service
<Windows Azure Platform 系列文章目录> 最近在和一些客户聊天,常常被遇到这样的问题: 1.问题一:我在创建一个新的Windows Azure Virtual Mac ...
- 【原创】Kakfa serializer包源代码分析
这个包很简单,只有两个scala文件: decoder和encoder,就是提供序列化/反序列化的服务.我们一个一个说. 一.Decoder.scala 首先定义了一个trait: Decoder[T ...
- C语言学习017:malloc和free
malloc和free都包含在<stdlib.h>头文件中 局部变量由于存储在栈中,一旦离开函数,变量就会被释放,当我们需要将数据持久使用,就需要将数据保存到堆中,而在堆中申请内存空间就需 ...
- 一篇文看懂Hadoop:风雨十年,未来何去何从
本文分为技术篇.产业篇.应用篇.展望篇四部分 技术篇 2006年项目成立的一开始,“Hadoop”这个单词只代表了两个组件——HDFS和MapReduce.到现在的10个年头,这个单词代表的是“核心” ...
- html5画布的旋转效果
keleyi.htm的代码如下: <!DOCTYPE HTML> <html> <head> <title>html旋转画布-柯乐义</title ...
- Windows Server 2008 R2 负载平衡入门篇
一.简单介绍负载均衡 负载均衡也称负载共享,它是指负载均衡是指通过对系统负载情况进行动态调整,把负荷分摊到多个操作节点上执行,以减少系统中因各个节点负载不均衡所造成的影响,从而提高系统的工作效率.在常 ...
- C#-INotifyPropertyChanged(解决数据绑定的界面刷新问题)
最近做项目用到DataGridView,用它绑定数据源后,如果数据源中的数据修改无法及时刷新到控件上,必须切换单元格的焦点才能导致刷新显示新数值,通过查官方文档,用INotifyPropertyCha ...
- html5学习笔记6-- canvas
绘制普通直线,先看效果图: 实现代码如下: <!DOCTYPE html> <html> <head lang="en"> <meta c ...
- 从NavigationController 下的UITableView中移除 header
this.AutomaticallyAdjustsScrollViewInsets = false; 解析:AutomaticallyAdjustsScrollViewInsets为系统自动为适应na ...