在gcdasyncsocket ios中断开套接字连接时未获得回调
我已经面临这个问题很多天了。虽然我使用了socketdiddisconnect方法,但在SocketDisconnect上没有收到回调,但它只在某些情况下收到回调,比如当我写入输入流时。我正在使用mac os sierra,并在xcode 8.3.2上运行iphone 5s 10.3.2的代码。任何帮助都将不胜感激 下面是我在我的类中实现的一些方法在gcdasyncsocket ios中断开套接字连接时未获得回调,ios,objective-c,callback,disconnect,gcdasyncsocket,Ios,Objective C,Callback,Disconnect,Gcdasyncsocket,我已经面临这个问题很多天了。虽然我使用了socketdiddisconnect方法,但在SocketDisconnect上没有收到回调,但它只在某些情况下收到回调,比如当我写入输入流时。我正在使用mac os sierra,并在xcode 8.3.2上运行iphone 5s 10.3.2的代码。任何帮助都将不胜感激 下面是我在我的类中实现的一些方法 #for socket creation -(void)start { NSLog(@"PROVO..."); _tcpSock
#for socket creation
-(void)start
{
NSLog(@"PROVO...");
_tcpSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *error = nil;
NSString *hostname = @"192.168.11.254";
uint16_t port = 8080;
if (![_tcpSocket connectToHost:hostname onPort:port withTimeout:5.0 error:&error])
{
NSLog(@"Unable to connect to due to invalid configuration: %@", error);
}
else
{
// _isSocketConnected = YES;
NSLog(@"Connecting...");
}
// while (true) {
// if ([_tcpSocket isDisconnected]) {
// [NSThread sleepForTimeInterval:2];
// [self start];
// }
// }
}
#for writing data to stream
-(void)writeOut:(NSString *)s second:(NSString *)cmd
{
if (s == nil) {
return;
}
_packDict = [[NSMutableDictionary alloc]init];
[_packDict setValue:s forKey:cmd];
//[[[TcpPacketClass sharedInstance]delegatesArray]count];
NSLog(@"Writing out the following:");
NSLog(@"%@", s);
NSData *requestData = [s dataUsingEncoding:NSUTF8StringEncoding];
if (self.tcpSocket!=nil&&[_tcpSocket isConnected]) {
NSLog(@"Data write successfully");
[_tcpSocket writeData:requestData withTimeout:-1.0 tag:0];
}
if ([_tcpSocket isConnected]) {
[_tcpSocket readDataWithTimeout:-1 buffer:[NSMutableData data] bufferOffset:0 maxLength:0 tag:0];
}
// [NSThread sleepForTimeInterval:2];
}
#get called when socket created
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
{
NSLog(@"socket:didConnectToHost:%@ port:%hu", host, port);
_isSocketConnected = YES;
NSString *zeroIndex;
// [[AppLoading sharedInstance] setDeviceDateTimeApiCall];
if (_packDict.count >0) {
NSArray *keys = [_packDict allKeys];
zeroIndex = [keys objectAtIndex:0];
}
NSString *packStr= [_packDict objectForKey:zeroIndex];
NSData *requestData = [packStr dataUsingEncoding:NSUTF8StringEncoding];
[sock writeData:requestData withTimeout:3.0 tag:0];
NSLog(@"packet sent successfully");
// [_packDict removeAllObjects];
//[_tcpSocket readDataToLength:sizeof(uint64_t) withTimeout:-1.0 tag:0];
dispatch_queue_t alwaysReadQueue = dispatch_queue_create("com.cocoaasyncsocket.alwaysReadQueue", NULL);
dispatch_async(alwaysReadQueue, ^{
while(![_tcpSocket isDisconnected]) {
[NSThread sleepForTimeInterval:5];
[_tcpSocket readDataWithTimeout:-1 tag:0];
}
});
// [sock readDataWithTimeout:-1 tag:0];
}
- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag
{
NSLog(@"hello its me:");
// if (_tcpSocket.writeStream==nil) {
// NSLog(@"write stream closed");
// [_tcpSocket setDelegate:nil];
// [_tcpSocket disconnect];
// [self start];
// }
if ([_tcpSocket isDisconnected]) {
NSLog(@"read stream closed");
// [_tcpSocket setDelegate:nil];
// [_tcpSocket disconnect];
[self start];
}
//[_tcpSocket readDataWithTimeout:-1 buffer:[NSMutableData data] bufferOffset:0 maxLength:0 tag:0];
}
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
{
NSLog(@"socketDidDisconnect:withError: \"%@\"", err);
[_tcpSocket setDelegate:nil];
[_tcpSocket disconnect];
[NSThread sleepForTimeInterval:2];
[self start];
}