【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发送文件、上传和下载)的更多相关文章

  1. java web学习总结(二十四) -------------------Servlet文件上传和下载的实现

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  2. (转载)JavaWeb学习总结(五十)——文件上传和下载

    源地址:http://www.cnblogs.com/xdp-gacl/p/4200090.html 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传 ...

  3. JavaWeb学习总结,文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  4. java文件上传和下载

    简介 文件上传和下载是java web中常见的操作,文件上传主要是将文件通过IO流传放到服务器的某一个特定的文件夹下,而文件下载则是与文件上传相反,将文件从服务器的特定的文件夹下的文件通过IO流下载到 ...

  5. JavaWeb学习总结(五十)——文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  6. 文件上传和下载(可批量上传)——Spring(二)

    针对SpringMVC的文件上传和下载.下载用之前“文件上传和下载——基础(一)”的依然可以,但是上传功能要修改,这是因为springMVC 都为我们封装好成自己的文件对象了,转换的过程就在我们所配置 ...

  7. Struts2 之 实现文件上传和下载

    Struts2  之 实现文件上传和下载 必须要引入的jar commons-fileupload-1.3.1.jar commons-io-2.2.jar 01.文件上传需要分别在struts.xm ...

  8. 19、文件上传与下载/JavaMail邮件开发

    回顾: 一. 监听器 生命周期监听器 ServletRequestListener HttpSessionListener ServletContextListener 属性监听器 ServletRe ...

  9. JavaWeb——文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  10. 文件上传与下载/Mail

    文件上传与下载 提交方式:post 表单中要有文件上传的表单项 input type=”file”而且必须有name属性 表单类型要加入 encytype=”mulitpart/form-data” ...

随机推荐

  1. Cocos2d-x 3.0 使用TinyXml 解析XML文件

    在cocos2d-x 3.0中Xml解析已经不用自己找库了,已经为我们集成好了. text.xml <!--?xml version ="1.0" encoding =&qu ...

  2. WINCE平台下C#应用程序中使用看门狗

    看门狗定时器(WDT,Watch Dog Timer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个大数,程序开始运行后看门狗开始倒计数.如果程序运行正常,过一段时间CPU应发出指令让 ...

  3. 详解虚拟机(windows)下搭建SVN服务器

    安装前的准备 1.虚拟机的用户名最好是英文 2.严格按照步骤做,否则有可能不成功 3.如果安装失败,在虚拟机下的控制板完全下载VisualSVN-Server-2.7.7,重新安装 软件下载地址: h ...

  4. 自定义cell时,在宽的手机上显示太窄解决办法

    1.工程设置要如下:见第二个红框,清除launch screan file 后面的内容 2.自定义的cell要设置auto layout 和size clases

  5. XAlign - Xcode插件 - 对齐代码

    链接地址:http://my.oschina.net/u/2473136/blog/520620 一款十分强大的自定义对齐模式插件 开源地址:https://github.com/qfish/XAli ...

  6. BZOJ 1898: [Zjoi2004]Swamp 沼泽鳄鱼( dp + 矩阵快速幂 )

    ----------------------------------------------------------------------- #include<cstdio> #incl ...

  7. php随笔3-thinkphp 学习-ThinkPHP3.1快速入门(1)基础

    ThinkPHP3.1快速入门(1)基础 简介 ThinkPHP是一个快速.简单的基于MVC和面向对象的轻量级PHP开发 框架,遵循Apache2开源协议发布,从诞生以来一直秉承简洁实用的设计原则,在 ...

  8. ThinkPHP第十天(_initialize方法,SESSION销毁,分组配置,include文件引入,JOIN用法)

    1.Action类中的_initialize()函数,先于任何自定义操作函数运行,可认为是控制器的前置操作.可用于检测用户是否登录等检测. 如果多个模块(Action)需要相同_initialize( ...

  9. [LeetCode]题解(python):044-Wildcard Matching

    题目来源: https://leetcode.com/problems/wildcard-matching/ 题意分析: 定义两个新字符规则,'?'代表任意一个字符,’*‘代表任意长度的任意字符.输入 ...

  10. shell学习之常用命令总结

    1.find命令 主要用途:主要用来做文件查找. 使用方法:查找文件的方式可以基于:文件名,文件时间属性,文件的所有者和组,文件权限属性,文件类型属性,文件大小,另外可以指定 查找目录的深度,排除指定 ...