高级UIKit-09(TCPSocket发送文件、上传和下载)
【day1101_SocketSendFile】:发送文件到服务端
发送文件需要在该文件上拼接消息头,比如类型,文件名,文件大小
// 服务端
- (void)viewDidLoad
{
[super viewDidLoad];
// 创建服务器
self.socketServer = [[AsyncSocket alloc] initWithDelegate:self];
// 设置端口
[self.socketServer acceptOnPort: error:Nil];
}
// 接收连接
- (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket{
self.socketNew = newSocket;
}
// 连接成功
- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{
[self.socketNew readDataWithTimeout:- tag:];// 读取数据
}
// 读取数据
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
// 判断是否是头
NSData *headerData = [data subdataWithRange:NSMakeRange(, )];
NSString *headerString = [[NSString alloc] initWithData:headerData encoding:NSUTF8StringEncoding];
if (headerString && [headerString componentsSeparatedByString:@"&&"].count == ) {
NSArray *fileArray = [headerString componentsSeparatedByString:@"&&"];
NSString *type = fileArray[];
if ([type isEqualToString:@"file"]) { // 如果是文件
self.fileData = [NSMutableData data];
self.fileName = fileArray[];
self.fileLength = [fileArray[] intValue];
NSData *subData = [data subdataWithRange:NSMakeRange(, data.length - )];
[self.fileData appendData:subData];
}else{
}
}else{
[self.fileData appendData:data];
}
NSLog(@"%d,%d",data.length,self.fileData.length);
// 判断是否接收完成
if (self.fileData.length == self.fileLength) {
NSString *filePath = [@"/Users/tarena/yz/第三阶段(高级UI)/day11" stringByAppendingPathComponent:self.fileName];
[self.fileData writeToFile:filePath atomically:YES];
}
[self.socketNew readDataWithTimeout:- tag:];// 读取数据
}
//客户端
- (IBAction)clicked:(id)sender {
// 创建客户端
self.socketClient = [[AsyncSocket alloc] initWithDelegate:self];
// 连接服务器
if ([self.socketClient connectToHost:@"localhost" onPort: error:Nil]) {
NSLog(@"连接成功!");
}
if ([self.sendTextField.text hasPrefix:@"/"]) { // 如果是文件
// 得到文件路径
NSString *filePath = self.sendTextField.text;
// 转成data
NSData *fileData = [NSData dataWithContentsOfFile:filePath];
// 拼接信息头
NSString *headerString = [NSString stringWithFormat:@"file&&%@&&%d",[filePath lastPathComponent],fileData.length];
// 转成data
NSData *headerData = [headerString dataUsingEncoding:NSUTF8StringEncoding];
// 发送数据
NSMutableData *allData = [NSMutableData dataWithLength:];
[allData replaceBytesInRange:NSMakeRange(, headerData.length) withBytes:headerData.bytes];
[allData appendData:fileData];
[self.socketClient writeData:allData withTimeout:- tag:];
}else{ // 如果是文本
NSString *headerString = [NSString stringWithFormat:@"text&& &&"];
NSData *fileData = [headerString dataUsingEncoding:NSUTF8StringEncoding];
// 转为data
NSData *headerData = [headerString dataUsingEncoding:NSUTF8StringEncoding];
// 发送
NSMutableData *allData = [NSMutableData dataWithCapacity:];
[allData replaceBytesInRange:NSMakeRange(, headerData.length) withBytes:headerData.bytes]; // 替换为消息头
[allData appendData:fileData];
[self.socketClient writeData:allData withTimeout:- tag:];
}
}
- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag{
NSLog(@"发送完成!");
}
【day1102_uploadAndDown】:上传和下载客户端
需求:实现上传和下载功能
分三步完成,先上传,在获取下载列表,最后是下载
上传文件是通过在文件中拼接消息头完成
- (void)viewDidLoad
{
[super viewDidLoad];
self.socketClient = [[AsyncSocket alloc] initWithDelegate:self];
[self.socketClient connectToHost:@"192.168.1.188" onPort: withTimeout:- error:Nil];
// 发送数据
NSLog(@"发送数据");
NSString *headerString = [NSString stringWithFormat:@"upload&&%@&&%d",self.file.fileName,self.file.fileLength];
NSMutableData *allData = [MXUtils getAllDataByHeaderString:headerString];
NSData *fileData = [NSData dataWithContentsOfFile:self.file.filePath];
NSLog(@"%d",self.file.fileLength);
[allData appendData:fileData];
[self.socketClient writeData:allData withTimeout:- tag:];
self.labelUploadInfo.text = [NSString stringWithFormat:@"上传%@",self.file.fileName];
}
-(void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"上传成功" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:Nil, nil];
[alert show];
}
获取下载列表是通过互相发送消息,从服务端把文件对象(也就是文件在服务端的绝对路径)归档发送到客户端,然后在客户端反归档获取文件列表
- (void)viewDidLoad
{
[super viewDidLoad];
self.socketClient = [[AsyncSocket alloc] initWithDelegate:self];
[self.socketClient connectToHost:@"192.168.1.188" onPort: withTimeout:- error:Nil];
NSString *headerString = @"downList&& &&";
NSMutableData *allData = [MXUtils getAllDataByHeaderString:headerString];
[self.socketClient writeData:allData withTimeout:- tag:];
[self.socketClient readDataWithTimeout:- tag:];
}
-(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
// 反归档
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
self.filePathArray = [unarchiver decodeObjectForKey:@"downlist"];
NSLog(@"%@",self.filePathArray);
[self.tableView reloadData];
}
下载是通过列表中的文件路径发送给服务端,然后服务端根据其路径找到文件返回去
- (void)viewDidLoad
{
[super viewDidLoad];
self.fileData = [NSMutableData data];
self.socketClient = [[AsyncSocket alloc] initWithDelegate:self];
[self.socketClient connectToHost:@"192.168.1.188" onPort: withTimeout:- error:Nil];
// 发送数据
NSLog(@"发送数据");
NSString *headerString = [NSString stringWithFormat:@"download&&%@&&",self.file.filePath];
NSMutableData *allData = [MXUtils getAllDataByHeaderString:headerString];
NSLog(@"%d",self.file.fileLength);
[self.socketClient writeData:allData withTimeout:- tag:];
self.labelDownload.text = [NSString stringWithFormat:@"下载%@",self.file.fileName];
[self.socketClient readDataWithTimeout:- tag:];
}
-(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
[self.fileData appendData:data];
if (self.fileData.length == self.file.fileLength) {
[self.fileData writeToFile:[@"/Users/tarena/yz/第三阶段(高级UI)/day11/download" stringByAppendingPathComponent:self.file.fileName] atomically:YES];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"下载成功" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:Nil, nil];
[alert show];
}
[self.socketClient readDataWithTimeout:- tag:];
}
【day1103_UploadAndDownSocketServer】:上传和下载服务端
- (void)viewDidLoad
{
[super viewDidLoad];
self.socketServer = [[AsyncSocket alloc] initWithDelegate:self];
[self.socketServer acceptOnPort: error:Nil];
}
-(void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket{
NSLog(@"通道");
self.socketNew = newSocket;
}
-(void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{
NSLog(@"连接成功%@",host);
self.host = host;
[self.socketNew readDataWithTimeout:- tag:];
}
-(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
NSLog(@"读取数据成功");
// 判断是否有消息头
NSData *headerData = [data subdataWithRange:NSMakeRange(, )];
NSString *headerString = [[NSString alloc] initWithData:headerData encoding:NSUTF8StringEncoding]; // 消息头
if (headerString && [headerString componentsSeparatedByString:@"&&"].count == ) {
NSLog(@"有消息头");
NSArray *headerArray = [headerString componentsSeparatedByString:@"&&"];
NSString *type = headerArray[];
if ([type isEqualToString:@"upload"]) {
self.allData = [NSMutableData data];
self.fileName = headerArray[];
self.fileLength = [headerArray[] intValue];
NSData *subData = [data subdataWithRange:NSMakeRange(, data.length - )];
[self.allData appendData:subData];
self.labelUploadInfo.text = [NSString stringWithFormat:@"%@在上传%@文件",self.host,self.fileName];
self.progressUpload.progress = self.allData.length * 1.0 / self.fileLength;
}else if([type isEqualToString:@"downList"]){
NSData *data = [MXUtils getFilePathArrayDataByDirectoryPath:@""];
[self.socketNew writeData:data withTimeout:- tag:];
}else if([type isEqualToString:@"download"]){
NSString *filePath = headerArray[];
NSData *data = [NSData dataWithContentsOfFile:filePath];
[self.socketNew writeData:data withTimeout:- tag:];
}
}else{
[self.allData appendData:data];
self.progressUpload.progress = self.allData.length * 1.0 / self.fileLength;
}
if (self.allData.length == self.fileLength) {
NSString *path = [@"" stringByAppendingPathComponent:self.fileName];
NSLog(@"写到%@",path);
[self.allData writeToFile:path atomically:YES];
}
[self.socketNew readDataWithTimeout:- tag:];
}
把消息头存进要发送的数据中 并且固定占用多少字节
使用网络需要导入CFNetwork.framework框架
高级UIKit-09(TCPSocket发送文件、上传和下载)的更多相关文章
- java web学习总结(二十四) -------------------Servlet文件上传和下载的实现
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- (转载)JavaWeb学习总结(五十)——文件上传和下载
源地址:http://www.cnblogs.com/xdp-gacl/p/4200090.html 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传 ...
- JavaWeb学习总结,文件上传和下载
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- java文件上传和下载
简介 文件上传和下载是java web中常见的操作,文件上传主要是将文件通过IO流传放到服务器的某一个特定的文件夹下,而文件下载则是与文件上传相反,将文件从服务器的特定的文件夹下的文件通过IO流下载到 ...
- JavaWeb学习总结(五十)——文件上传和下载
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- 文件上传和下载(可批量上传)——Spring(二)
针对SpringMVC的文件上传和下载.下载用之前“文件上传和下载——基础(一)”的依然可以,但是上传功能要修改,这是因为springMVC 都为我们封装好成自己的文件对象了,转换的过程就在我们所配置 ...
- Struts2 之 实现文件上传和下载
Struts2 之 实现文件上传和下载 必须要引入的jar commons-fileupload-1.3.1.jar commons-io-2.2.jar 01.文件上传需要分别在struts.xm ...
- 19、文件上传与下载/JavaMail邮件开发
回顾: 一. 监听器 生命周期监听器 ServletRequestListener HttpSessionListener ServletContextListener 属性监听器 ServletRe ...
- JavaWeb——文件上传和下载
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- 文件上传与下载/Mail
文件上传与下载 提交方式:post 表单中要有文件上传的表单项 input type=”file”而且必须有name属性 表单类型要加入 encytype=”mulitpart/form-data” ...
随机推荐
- [置顶] js综合应用:表格的四则运算
在做调查问卷的过程中,遇到一个表格的统计问题,算是需要些js方面的综合知识,所以记录下来. 在上次完成了基本的求和的基础上,添加了基本的加减乘除四则运算. 基本需求简化后如下: 对应的htm了为: & ...
- Objective-c 访问控制
在Objective-c中定义类时,也可以使用类似于C++中public.private来修饰成员变量,如下: @intterface Test:NSObject{ @public int i; in ...
- asp.net连接ORACLE数据库
这段时间维护客户的一个系统,该系统使用的是ORACLE数据库,之前开发的时候用的都是MSSQL,并没有使用过ORACLE.这两种数据库虽然都是关系型数据库,但是具体的操作大有不同,这里作下记录. 连接 ...
- C#高级编程零散知识点
1.206-实现单链表的添加和插入 207-实现单链表的其他功能和 3.209-Lambda表达式 4.301-栈的介绍和BCL中的栈 4.501-进程和线程的概念[00_12_06][2015122 ...
- 什么是DNS劫持和DNS污染?
什么是DNS劫持和DNS污染? http://blogread.cn/it/article/7758?f=weekly 说明 我们知道,某些网络运营商为了某些目的,对 DNS 进行了某些操作,导致使用 ...
- 【MFC相关】图片显示
CPaintDC dc(this); if (!m_hBitmap) return; image.Attach(m_hBitmap); CRect rect; GetClientRect(&r ...
- 字符串匹配算法(KMP)
字符串匹配运用很广泛,举个简单例子,我们每天登QQ时输入账号和密码,大家有没有想过账号和密码是怎样匹配的呢?登录需要多长时间和匹配算法的效率有直接的关系. 首先理解一下前缀和后缀的概念: 给出一个问题 ...
- UltraEdit中java代码换行问题
在很多开发中始用的文本编辑器中UltraEdit是非常主流的种了,但是,随着版本的更新,最近几版中出现了以下问题 问题描述:当用UltraEd(14.0版本)编写Java代码时,当遇到{}换行时,希望 ...
- Nginx简单操作
Nginx简单操作 平滑重启:读取配置文件,正确后启动新nginx,关闭旧服务进程 # kill HUP nginx.pid # /usr/sbin/nginx -c /etc/nginx/nginx ...
- 腾讯地图之Marker
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...