2012-06-06 2 views
0

CocoaAsyncSocket을 사용하여 TCP 소켓 연결을 만들었으며 didReadData를 수행하려고 할 때마다 공백이 다시 나타납니다. 나는 breakpoint를 설정하고 디버깅을 시도 할 때 "msg"값이 @ ""이라는 것을 알았다.CocoaAsyncSocket을 사용하여 데이터를 읽으면 공백이 반환됩니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    NSData *data = nil; 
    // Initialize socket object and make it a delegate. Then call the delegate methods. 
    socket = [[AsyncSocket alloc] initWithDelegate:self]; 
    [self connect]; 
    [self onSocket:socket didConnectToHost:@"9.5.8.6" port:11005]; 
    [self onSocket:socket didReadData:data withTag:1]; // tags COULD be #defined ******* 

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 
    // Override point for customization after application launch. 
    self.viewController = [[[tekMatrixViewController alloc] initWithNibName:@"tekMatrixViewController" bundle:nil] autorelease]; 
    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

그리고 여기 내 onSocket입니다 : : 소켓 didReadData : 데이터 withTag : 방법 :

이 내 appDelegate.m는 모습입니다

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 
{ 
    NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length])]; 
    NSString *msg = [[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding]; 
    if(msg) 
    { 
     NSLog(@"RX:%@",msg); 
     if(msg == nil) 
     { 
      NSLog(@"msg is all Blanks"); 
     } 
    } 
    else 
    { 
     NSLog(@"Fail"); 
    }  
} 

주,이 방법에서 방법이다 CocoaAsyncLibrary. 제대로 메소드를 호출하는지 또는 올바른 인수를 전달하지 않는지, 또는 무엇인지 알 수 없습니다. 나는 응용 프로그램을 실행하면

, 내 콘솔에 표시되는 모든은 다음과 같습니다

2012-06-06 11:44:00.434 tekMatrix[1378:f803] connected 
2012-06-06 11:45:14.312 tekMatrix[1378:f803] RX: 

모든 모든 도움은 대단히 감사합니다.

감사합니다. onSocket

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    socket = [[AsyncSocket alloc] initWithDelegate:self]; 
    NSError *error = nil; 
    if (![socket connectToHost:@"199.5.83.63" onPort:11005 error:&error]) 
    { 
     NSLog(@"Error connecting: %@", error); 
    } 

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 
    // Override point for customization after application launch. 
    self.viewController = [[[tekMatrixViewController alloc] initWithNibName:@"tekMatrixViewController" bundle:nil] autorelease]; 
    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

지금 내가 연결되어있어 볼 수 있어요,하지만 난 아직도 이해 아니에요 : 여기에 편집

내가 지금 내 didFinishLaunchingWithOptions 방법이 무엇인지입니다 : 소켓 didReadData : 데이터 withTag : 메서드가 호출되지 않습니다. 이것에 대한 도움은 많이 감사 할 것입니다. 감사!

답변

3

죄송합니다. 저는 다음과 같이 말합니다.

그래서이 코드

[self connect]; 
[self onSocket:socket didConnectToHost:@"9.5.8.6" port:11005]; 
[self onSocket:socket didReadData:data withTag:1] 

이 전혀 이해가되지 않습니다 않습니다 (소켓이 경우) 위임자 -

당신은 당신이 대리인의 프로토콜을 직접 수행하기 위해 구현 된 메소드를 호출하지 말아. 그것을 제거하십시오.

대신

NSError *error = nil; 
if (![socket connectToHost:@"9.5.8.6" onPort:11005 error:&error]) { 
    NSLog(@"Error connecting: %@", error); 
} 

및보다

는, 소켓이 socket:didConnectToHost:port:를 호출 연결하기 위해 다음과 같은 코드를이 있어야, 그

-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port 
{ 
     [sock writeData:self.data withTimeout:-1 tag:1]; 

} 

처럼 보일 수 있습니다 및 객체 소켓은 더 대리자 메서드를 호출합니다 귀하가 제공 한 구현.


그러나 delegation

당신이 바로 그것을 얻을, 밖으로 코코아 통해 하나 개의 매우 중요한 패턴 (- 터치), 보장이다.

+0

DDLogError 란 무엇입니까? 자신의 로깅 기능? –

+0

오, 아니, 유용한 도구 모음 인 [Lumberjack] (https://github.com/robbiehanson/CocoaLumberjack) 형식입니다. – vikingosegundo

+1

StackOverflow의 지침을 철저히 지키지는 못했지만 예제 코드에서 제 3자를 사용하지 않는 것이 더 좋다고 생각합니다. NSLog()는 간단하게 유지하고 신규 이민자를 혼동하지 않을 것입니다. –

관련 문제