Advanced UIKit-09 (TCPSocket to send files, upload and download)-Readback (IOS)

[Day1101_SocketSendFile]: Send the file to the server

To send a file, you need to splice the message header on the file, such as type, file name, and file size

// 服务端

- (void)viewDidLoad

{

    [super viewDidLoad];

    // 创建服务器

    self.socketServer = [[AsyncSocket alloc] initWithDelegate:self];

    // 设置端口

    [self.socketServer acceptOnPort:8000 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:-1 tag:0];// 读取数据

}

// 读取数据

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{

    // 判断是否是头

    NSData *headerData = [data subdataWithRange:NSMakeRange(0, 50)];

    NSString *headerString = [[NSString alloc] initWithData:headerData encoding:NSUTF8StringEncoding];

    if (headerString && [headerString componentsSeparatedByString:@"&&"].count == 3) {

        NSArray *fileArray = [headerString componentsSeparatedByString:@"&&"];

        NSString *type = fileArray[0];

        if ([type isEqualToString:@"file"]) { // 如果是文件

            self.fileData = [NSMutableData data];

            self.fileName = fileArray[1];

            self.fileLength = [fileArray[2] intValue];

            NSData *subData = [data subdataWithRange:NSMakeRange(50, data.length - 50)];

            [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:-1 tag:0];// 读取数据

}

 

//客户端

- (IBAction)clicked:(id)sender {

    // 创建客户端

    self.socketClient  = [[AsyncSocket alloc] initWithDelegate:self];

    // 连接服务器

    if ([self.socketClient connectToHost:@"localhost" onPort:8000 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:50];

        [allData replaceBytesInRange:NSMakeRange(0, headerData.length) withBytes:headerData.bytes];

        [allData appendData:fileData];

        [self.socketClient writeData:allData withTimeout:-1 tag:0];

    }else{ // 如果是文本

        NSString *headerString = [NSString stringWithFormat:@"text&& &&"];

        NSData *fileData = [headerString dataUsingEncoding:NSUTF8StringEncoding];

        // 转为data

        NSData *headerData = [headerString dataUsingEncoding:NSUTF8StringEncoding];

        // 发送

        NSMutableData *allData = [NSMutableData dataWithCapacity:50];

        [allData replaceBytesInRange:NSMakeRange(0, headerData.length) withBytes:headerData.bytes]; // 替换为消息头

        [allData appendData:fileData];

        [self.socketClient writeData:allData withTimeout:-1 tag:0];

    }

   

}

- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag{

    NSLog(@"Send completed!");

}

[Day1102_uploadAndDown]: upload and download client

Requirements: realize upload and download functions

 Completed in three steps, first upload, get the download list, and finally download

Uploading the file is completed by splicing the message header in the file

-( void )viewDidLoad 

{ 

    [super viewDidLoad]; 

    self.socketClient = [[AsyncSocket alloc] initWithDelegate:self]; 

    [self.socketClient connectToHost: @" 192.168 . 1.188 " onPort: 8000 withTimeout:- 1 error:Nil]; 

    / / Send data 

    NSLog( @" send data ");

    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:-1 tag:0];

    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:8000 withTimeout:-1 error:Nil];

    NSString *headerString = @"downList&& &&";

    NSMutableData *allData = [MXUtils getAllDataByHeaderString:headerString];

    [self.socketClient writeData:allData withTimeout:-1 tag:0];

    [self.socketClient readDataWithTimeout:-1 tag:0];

 

}

 

-(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:8000 withTimeout:-1 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:-1 tag:0];

    self.labelDownload.text = [NSString stringWithFormat:@"下载%@",self.file.fileName];

    [self.socketClient readDataWithTimeout:-1 tag:0];

}

 

 

-(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:-1 tag:0];

}

【day1103_UploadAndDownSocketServer】:上传和下载服务端

- (void)viewDidLoad

{

    [super viewDidLoad];

   

    self.socketServer = [[AsyncSocket alloc] initWithDelegate:self];

    [self.socketServer acceptOnPort:8000 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:-1 tag:0];

}

 

-(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{

    NSLog(@"读取数据成功");

    // 判断是否有消息头

    NSData *headerData = [data subdataWithRange:NSMakeRange(0, 100)];

    NSString *headerString = [[NSString alloc] initWithData:headerData encoding:NSUTF8StringEncoding]; // 消息头

    if (headerString && [headerString componentsSeparatedByString:@"&&"].count == 3) {

        NSLog(@"有消息头");

        NSArray *headerArray = [headerString componentsSeparatedByString:@"&&"];

        NSString *type = headerArray[0];

        if ([type isEqualToString:@"upload"]) {

            self.allData = [NSMutableData data];

            self.fileName = headerArray[1];

            self.fileLength = [headerArray[2] intValue];

            NSData *subData = [data subdataWithRange:NSMakeRange(100, data.length - 100)];

            [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:-1 tag:0];

        }else if([type isEqualToString:@"download"]){

            NSString *filePath = headerArray[1];

            NSData *data = [NSData dataWithContentsOfFile:filePath];

            [self.socketNew writeData:data withTimeout:-1 tag:0];

        }

       

    }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:-1 tag:0];

}

  把消息头存进要发送的数据中 并且固定占用多少字节

使用网络需要导入CFNetwork.framework框架


Guess you like

Origin blog.csdn.net/qq_27740983/article/details/51258363