使用GCDAsyncSocket创建TCP创建长连接总结:
1、GCDAsyncSocketDelegate代理不执行,产生的原因:对于初始化类需要创建单例对象,有可能是由于它本身的原因到时在代理还未执行完前就已经释放掉了,所以需要采用单例的方式进行初始化。
+(YBSocketClient *)Share
{
static YBSocketClient *manager=nil;
static dispatch_once_t once;
dispatch_once(&once, ^{
manager=[[YBSocketClient alloc]init];
dispatch_queue_t mainQueue = dispatch_get_main_queue();
asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:manager delegateQueue:mainQueue];
});
return manager;
}
2、与服务器连接方法:
NSError *error = nil;
if (![asyncSocket connectToHost:@"192.168.3.61" onPort:60000 error:&error])
{
NSLog(@"连接失败");
}
3、连接成功会执行代理
- (void)createSocketConnect:(NSString *)hostAddress hostPort:(NSInteger)port{
dispatch_queue_t mainQueue = dispatch_get_main_queue();
// Setup logging framework
asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:mainQueue];
NSError *error = nil;
if (![asyncSocket connectToHost:@"192.168.3.61" onPort:60000 error:&error])
{
NSLog(@"连接失败");
}
[asyncSocket writeData:[@"123" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:10 tag:1];
}
4、发送数据:
[asyncSocket writeData:[@"123" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:10 tag:1];
5、发送数据的时候有可能会发现接收不到的返回或者不能主动接收服务器发送回来的数据。在连接成功和didReadData这两个代理方法中需要设置超时的时间,要不然在创建完第一次连接后可能socket就已经主动的将该线程关闭掉了导致后面接受不到数据。
设置保持超时的方法:
[sock readDataWithTimeout:-1 tag:200];