转眼又到了练习日 我们复习一下这段时间学的一些知识:
大量数据通过Socket传输:
1、客户端发送时对文件进行处理:
NSString *filePath = @"/Users/ivan/Documents/第二期/视频/day29/3打地鼠续.mp4";
NSData *fileData = [NSData dataWithContentsOfFile:filePath];
//文件名和文件长度拼接到一个字符串中
NSString *headerString = [NSString stringWithFormat:@"%@&&%ld",[filePathlastPathComponent],fileData.length];
NSData *headerData = [headerString dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%ld",headerData.length);
//创建一个100个字节的data
NSMutableData *allData = [NSMutableDatadataWithLength:100];
//替换一部分
[allData replaceBytesInRange:NSMakeRange(0, headerData.length)withBytes:headerData.bytes];
//把文件数据追加到后面
[allData appendData:fileData];
// 往端口写数据
[self.clientSocketwriteData:allData withTimeout:-1tag:0];
//创建客户端socket
self.clientSocket = [[AsyncSocketalloc]initWithDelegate:self];
//建立链接
[self.clientSocketconnectToHost:self.hostTF.textonPort:8000error:nil];
2、服务器接收到数据时进行处理:
//已经读取到数据
-(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
//取出前100个字节的数据
NSData *headerData = [data subdataWithRange:NSMakeRange(0, 100)];
NSString *headerString = [[NSStringalloc]initWithData:headerDataencoding:NSUTF8StringEncoding];
//判断是不是头数据
if (headerString&&[headerString componentsSeparatedByString:@"&&"].count==2) {//是头数据
NSArray *headers = [headerString componentsSeparatedByString:@"&&"];
self.fileName = headers[0];
self.length = [headers[1] longLongValue];
//抛去头剩下的文件数据得到
NSData *subFileData = [data subdataWithRange:NSMakeRange(100, data.length-100)];
//每次接收到头的话都初始化data避免多个文件data在同一个data中
self.allData = [NSMutableData data];
[self.allData appendData:subFileData];
}else{//不包含头的数据
[self.allData appendData:data];
}
//判断文件是否传输完成
if (self.allData.length==self.length) {
//把传过来的数据储存
NSString *newPath = [@"/Users/ivan/Desktop/a"stringByAppendingPathComponent:self.fileName];
//加载到内存中也是二进制数据
[self.allData writeToFile:newPath atomically:YES];
}
//把传输过来的二进制数据转成字符串
NSLog(@"%ld",data.length);
//调用读取数据的方法 防止一个文件一次没传完
[self.myNewSocketreadDataWithTimeout:-1tag:0];
网络请求:
一、直接从网络上加载图片:
导入:#import "UIImageView+AFNetworking.h"
NSString *path = @"http://pic28.nipic.com/20130419/12299514_180213138000_2.jpg";
UIImageView *iv = [[UIImageViewalloc]initWithFrame:self.view.bounds];
[iv setImageWithURL:[NSURL URLWithString:path]];
[iv setImageWithURL:[NSURLURLWithString:path] placeholderImage:[UIImageimageNamed:@"a.png"]];
[self.view addSubview:iv];
二、纯代码添加UINavigationController
self.window = [[UIWindowalloc]initWithFrame:[UIScreenmainScreen].bounds];
ViewController * vc = [[ViewControlleralloc]init];
UINavigationController * nv = [[UINavigationControlleralloc]initWithRootViewController:vc];
self.window.rootViewController =nv;
[self.windowmakeKeyAndVisible];
三、从网络请求数据:有get 和post两种方法
get方法:
导入:#import "AFNetworking.h"
// 使用AFNetworking发出http请求
NSString *webPath = @"http://apis.juhe.cn/cook/query";
// key=&menu=黄焖鸡&rn=10&pn=3
NSDictionary *params =@{@"key":@"80996127f667eac43832103850b3b13a",@"menu":@"黄焖鸡",@"rn":@"10"};
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];
// 使用manager发出请求的时候需要做一下响应数据的序列化
[manager setResponseSerializer:[AFHTTPResponseSerializerserializer]];
//用get请求,若webPath已经包含所有信息,则id后边写nil
[manager GET:webPath parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:0error:nil];
NSLog(@"请求成功:%@",dic);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"请求失败");
}];
Socket连接与HTTP连接 一、Socketsocket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)。 通过Socket,我们才能使用TCP/IP协议。Socket的出现只是使得程序员更方便地使用TCP/IP协议而已TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口二、TCP和UDP1、TCP是面向链接的,TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的可靠性; 而UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议。2、也正由于1所说的特点,使得UDP的开销更小数据传输速率更高,因为不必进行收发数据的确认,所以UDP的实时性更好。知道了TCP和UDP的区别,就不难理解为何采用TCP传输协议的MSN比采用UDP的QQ传输文件慢了,但并不能说QQ的通信是不安全的,因为程序员可以手动对UDP的数据收发进行验证,比如发送方对每个数据包进行编号然后由接收方进行验证,UDP因为在底层协议的封装上没有采用类似TCP的“三次握手”导致效率更高。三、Socket连接与HTTP连接由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。 而HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方建立的是Socket连接,服务器就可以直接将数据传送给客户端;若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。Sockt:传输效率高因为可以完全自定义头数据 对程序员要求高 ,可实现即使通讯HTTP:容错性强 开发效率高 http工作中用到更多
简单快速
因为HTTP协议简单,所以HTTP服务器的程序规模小,因而通信速度很快灵活HTTP允许传输任意类型的数据HTTP 0.9和1.0使用非持续连接限制每次连接只处理一个请求,服务器对客户端的请求做出响应后,马上断开连接,这种方式可以节省传输时间
学习ios 重要还是要理清楚思路 在做或者看老师代码的时候 自己多想想为什么 不要自己看着就抄 另外还是要推荐一下 蓝懿IOS这个培训机构 和刘国斌老师刘国斌老师还是很有名气的,听朋友说刘老师成立了蓝懿iOS,,老师讲课方式很独特,能够尽量让每个人都能弄明白,有的比较难懂的地方,如果有的地方还是不懂得话,老师会换个其它方法再讲解,这对于我们这些学习iOS的同学是非常好的,多种方式的讲解会理解得更全面,这个必须得给个赞,嘻嘻,还有就是这里的学习环境很好,很安静,可以很安心的学习,安静的环境是学习的基础,小班讲课,每个班20几个学生,学习氛围非常好,每天都学到9点多才离开教室,练习的时间很充裕,而且如果在练习的过程中有什么困难,随时可以向老师求助,不像其它机构,通过视频教学,有的甚至学完之后都看不到讲师本人,问点问题都不方便,这就是蓝懿与其它机构的区别,相信在刘国斌老师的细心指导下,每个蓝懿学员都能找到满意的工作,加油!
写博客第五十九天;
QQ:565803433