高级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” ...
随机推荐
- ASP.NET页面传值的几种方式
页面传值是学习asp.net初期都会面临的一个问题,总的来说有页面传值. 存储对象传值.ajax.类.model.表单等!下面欧柏泰克和大家一起来看看asp.net页面传值方式一般有哪些?常用的较简单 ...
- 多条件搜索拼接Sql语句
1. 如下实例: 1.1 如下图所示:[通过用户输入的数据拼接Sql搜索语句] 1.2 private void button2_Click( ...
- xhprof安装记录
选择一个工具分析PHP函数调用的资源耗用明细,以图表化的形式展现,方便优化代码. 安装xhprof $ pecl install xhprof-beta 在php.ini引用的extension中 ...
- 融合python2和python3
很多情况下你可能会想要开发一个程序能同时在python2和python3中运行. 想象一下你开发了一个模块,成百上千的人都在使用它,但不是所有的用户都同时使用python 2和3.这种情况下你有两个选 ...
- java异常回顾
String getMessage():返回此Throwable的详细消息字符串 void PrintStackTrace():将throw及其追踪输出至标准错误流 void printStackTr ...
- 「OC」 多态
一.基本概念 多态在代码中的体现,即为某一类事物的多种形态,OC对象具有多态性.必须要有继承,没有继承就没有多态. 在使用多态时,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指 ...
- unity之uv贴图画圆弧,圆弧面,不规则图形
由于最近一直没有时间,所以这篇博客一直没发,下面我说说uv画圆弧,圆面,不规则面拼接. 先来两张效果图 图截的不咋滴,凑合着看吧,画圆弧主要用的贝塞尔曲线画的,我感觉这个比较简单,当然大家也可以使用圆 ...
- Django admin究竟要怎么写才优雅
比如在Django admin 注册models时,会用到. 对于APP里自带的models,可以使用这种方式注册. from django.contrib import admin # Regist ...
- r语言之给定的概率密度函数生成随机数
假设概率密度函数为: 思路: 首先产生-1到1之间的均匀分布随机数x,和0到1之间的均匀分布随机数y. 如果y<f(x),则x是符合该概率密度的随机数,否则,重复上述操作. 用r语言生成100个 ...
- [LeetCode]题解(python):025-Reverse Nodes in k-Group
题目来源: https://leetcode.com/problems/reverse-nodes-in-k-group/ 题意分析: 这道题目和上一题目类似,输入一个链表和一个整型k.每k个翻转一下 ...