socket 发送与接收

#import "TRViewController.h"


@interface TRViewController ()

@property (weak, nonatomic) IBOutlet UITextField *hostTF;

@property (weak, nonatomic) IBOutlet UITextField *sendInfoTF;

@property (weak, nonatomic) IBOutlet UITextView *myTV;

@property (nonatomic, strong)AsyncSocket *clientSocket;

@property (nonatomic, strong)AsyncSocket *serverSocket;

@property (nonatomic, strong)AsyncSocket *acceptNewSocket;

@property (nonatomic, copy)NSString *host;

@property (nonatomic, strong)NSMutableData *allFileData;


@property (nonatomic, copy)NSString *fileName;

@property (nonatomic)int fileLength;

@end


@implementation TRViewController


- (void)viewDidLoad

{

    [super viewDidLoad];

    

    

  

    self.allFileData = [NSMutableData data];

    

    

    //1.创建Socket对象

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

    //2.监听某一个端口等待别人连接进来

    [self.serverSocket acceptOnPort:8000 error:Nil];

}

//当有新的连接进来的时候

-(void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket{

    self.acceptNewSocket = newSocket;

}

//当连接到某个ip的时候

-(void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{

    NSLog(@"已经连接到:%@",host);

    self.host = host;

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

}


//当接收到数据的时候 此方法不会自动调用 需要手动调用读取的方法

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

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

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

    //判断是否包含消息头

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

        

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

        

        NSString *type = headers[0];

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

           self.fileName = headers[1];

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

            

            

            self.allFileData = [NSMutableData data];

            

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

            [self.allFileData appendData:subFileData];

            

            

        }else{//如果接收到的是文本

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

            NSString *text = [[NSString alloc]initWithData:textData encoding:NSUTF8StringEncoding];

            NSLog(@"接收到文本:%@",text);

        }

        


    }else{//如果不是第一次没有包含消息头  就直接把data放进allFileData里面

        [self.allFileData appendData:data];

    }

    //判断有没有下载完成

    if (self.allFileData.length == self.fileLength) {

        

        NSString *newFilePath = [@"/Users/tarena/Desktop/" stringByAppendingPathComponent:self.fileName];

        [self.allFileData writeToFile:newFilePath atomically:YES];

    }


    

    

    

    //继续读取数据

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

}

//当断开连接的时候

-(void)onSocketDidDisconnect:(AsyncSocket *)sock

{


}


- (IBAction)clicked:(id)sender {

    

    //创建客户端代码

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

    

    [self.clientSocket connectToHost:self.hostTF.text onPort:8000 error:nil];

    

    NSString *filePath = @"/Volumes/U/Networking_and_Multitasking/day01/光辉岁月.mp3";

     NSData *fileData = [NSData dataWithContentsOfFile:filePath];

    NSString *headerString = [NSString stringWithFormat:@"file&&%@&&%lu",[filePath lastPathComponent],(unsigned long)fileData.length];

    NSData *headerData = [headerString dataUsingEncoding:NSUTF8StringEncoding];

    //创建一个100个字节的可变dataheaderData装进去

    NSMutableData *allData = [NSMutableData dataWithLength:100];

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

    

    [allData appendData:fileData];

    

   

    NSLog(@"%d",fileData.length);

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

    

    

    

}


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

    NSLog(@"发送完成!!!");

}



- (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


@end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值