#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个字节的可变data把headerData装进去
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