第一次写东西文笔不好,不知道从何下手,想想就从这段时间做智能家居相关的APP中遇到的GCDAsyncSocket使用问题着手吧!
首先得大概了解TCP原理和UDP的一点区别!当然了我自己也是似懂非懂的状态,这些还是要靠自己慢慢摸索,多看看别人的blog见解,网上一搜一大把。GCDAsyncSocket是IOS中TCP通讯使用的一个第三方库。至于的它的什么三次握手啊这些网上多的很,我也不做过多的重复。下面就从demo开始吧!
//客户端方面
导入库 #import"GCDAsyncSocket.h" 这个可以从git上面下载!记得要实现它的GCDAsyncSocketDelegate!
现在就开始初始化GCDAsyncSocket对象l,同时需要连接到服务端IP和固定端口,就是先建立一个通讯的通道。
- (IBAction)connectBtn:(id)sender {
NSError* err;
clientSocket=[[GCDAsyncSocketalloc]initWithDelegate:selfdelegateQueue:dispatch_get_main_queue()];
[clientSocketconnectToHost:IPTextField.textonPort:PortTextField.text.intValueerror:&err];
}
这里实现GCDAsyncSocketDelegate可以判断通道是否建立成功,失败的话你可以选择继续重连,这个根据具体情况来定
- (void)socket:(GCDAsyncSocket*)sock didConnectToHost:(NSString*)host port:(uint16_t)port {
NSLog(@"连接成功---%@----%d",host,port);
UIAlertView* av=[[UIAlertViewalloc]initWithTitle:@"连接成功"message:nildelegate:nilcancelButtonTitle:@"OK"otherButtonTitles:nil,nil];
[av show];
[sockreadDataWithTimeout:-1tag:100];
}
// 如果对象关闭了 这里也会调用
- (void)socketDidDisconnect:(GCDAsyncSocket*)sock withError:(NSError*)err {
NSLog(@"连接失败 %@", err);
// 断线重连
[clientSocketconnectToHost:IPTextField.textonPort:(uint16_t)(PortTextField.text.intValue)error:&err];
}
现在的话就是发送数据给服务端了,通讯毕竟是为了传输数据的。这里可以直接调用GCDAsyncSocket本身的write方法,这里的timeout是超时时间,
- (IBAction)sendData:(id)sender {
NSData* data=[ProtocolCommandaddNumberCommandWithNumber:ContentTextField.text];
[clientSocketwriteData:datawithTimeout:6 tag:100];
}
当数据发送成功的话也会回调GCDAsyncSocketDelegate里面的方法:这个的话就可以选择性重发数据
- (void)socket:(GCDAsyncSocket*)sock didWriteDataWithTag:(long)tag {
NSLog(@"---发送数据的 tag---%ld",tag);
}
前面的这些只是单纯的发送数据到服务端,但绝大部分我们需要接收服务端返回的数据来判断发送的数据是否正确!这个也是回调GCDAsyncSocketDelegate里面的方法:至于数据的处理就得看服务器的定义了 这个就不做解释了。
- (void)socket:(GCDAsyncSocket*)sock didReadData:(NSData*)data withTag:(long)tag {
NSString*ip = [sockconnectedHost];
uint16_tport = [sockconnectedPort];
NSString*s = [[NSStringalloc]initWithData:dataencoding:NSUTF8StringEncoding];
UIAlertView* av=[[UIAlertViewalloc]initWithTitle:@"接收数据"message:sdelegate:nilcancelButtonTitle:@"OK"otherButtonTitles:nil,nil];
[avshow];
NSLog(@"接收到服务器返回的数据 tcp [%@:%d] %@", ip, port, s);
[sockreadDataWithTimeout:-1tag:tag];//持续接收服务端放回的数据
}
第一次就这么多吧,不足之处希望多多谅解!