Advanced UIKit-09(ファイルを送信し、アップロードおよびダウンロードするためのTCPSocket)-リードバック(IOS)

[Day1101_SocketSendFile]:ファイルをサーバーに送信します

ファイルを送信するには、タイプ、ファイル名、ファイルサイズなどのメッセージヘッダーをファイルに接合する必要があります。

// 服务端

- (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(@ "送信完了!");

}

[Day1102_uploadAndDown]:アップロードおよびダウンロードクライアント

要件:アップロードおよびダウンロード機能を実現する

 最初のアップロード、ダウンロードリストの取得、最後のダウンロードの3つのステップで完了

ファイルのアップロードは、ファイルのメッセージヘッダーを接合することで完了します。

- (ボイド)のviewDidLoad 

{ 

    [スーパーのviewDidLoad]; 

    self.socketClient = [[AsyncSocket ALLOC] initWithDelegate:自己]; 

    [self.socketClient connectToHost:@ " 192.1681.188 " onPort:8000 withTimeout: - 1つのエラー:なし]; 

    / / データ送信

    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:-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框架


おすすめ

転載: blog.csdn.net/qq_27740983/article/details/51258363
おすすめ