2012-05-29 2 views
3

TCP 연결 앱을 사용하려고했는데 handleEvent에 NSStreamEvent "4"가 표시됩니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?NSStream 핸들 이벤트 부여 상태 4

내 코드가 같은입니다

,

-(void) initNetworkCommunication { 

CFReadStreamRef readStream; 
CFWriteStreamRef writeStream; 
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"localhost", 80, &readStream, &writeStream); 

inputStream = (__bridge_transfer NSInputStream *)readStream; 
outputStream = (__bridge_transfer NSOutputStream *)writeStream; 
[inputStream setDelegate:self]; 
[outputStream setDelegate:self]; 
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[inputStream open]; 
[outputStream open]; 

} 


- (IBAction)didTapButton:(id)sender { 

NSString *response = inputTextField.text; 
NSLog(@"%@", response); 
NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]]; 
[outputStream write:[data bytes] maxLength:[data length]]; 
} 



- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { 

    switch (streamEvent) { 

    case NSStreamEventOpenCompleted: 
     NSLog(@"Stream opened"); 
     break; 

    case NSStreamEventHasBytesAvailable: 
     NSLog(@"Stream has bytes available"); 

     break;   

    case NSStreamEventErrorOccurred: 
     NSLog(@"Can not connect to the host!"); 
     break; 

    case NSStreamEventEndEncountered: 
     NSLog(@"Stream closed"); 

     break; 

    default: 

     NSLog(@"Unknown event: %@ : %d", theStream, streamEvent); 
    } 

    } 

콘솔이 제공 서버에 메시지를 보내려고

2012-05-29 13:37:07.132 GestureTrial[24289:f803] Stream opened 
2012-05-29 13:37:07.133 GestureTrial[24289:f803] Stream opened 
2012-05-29 13:37:07.133 GestureTrial[24289:f803] Unknown event: <__NSCFOutputStream: 0x6b85c70> : 4 

. 나는 맥용 tcp 테스터 응용 프로그램으로 시험해 보았는데, 문제가 없을 수도있다. 출력은 장치 및 시뮬레이터에서 동일합니다. 어떤 도움이라도 대단히 감사 할 것입니다.

답변

9

사실 당신은 아무 잘못도 없습니다.

이 이벤트 (보통 NSStreamEventHasSpaceAvailable)는 스트림에 다시 쓰고 다시 쓰기 가능한 스트림을 작성했음을 알려주고 스트림에 기록한 후에 발생합니다. NSStream Class Reference 또는 정확하게는 Stream Event Constants을 참조하십시오.

연산자가 <<이 아닌 경우 n 개의 자리에 대해 왼쪽으로 시프트 비트를 의미합니다 (각 시프트는 2를 곱한 것과 같습니다). 번역은 다음과 같습니다 많은 응용 프로그램에서

typedef enum { 
    NSStreamEventNone = 0, 
    NSStreamEventOpenCompleted = 1, 
    NSStreamEventHasBytesAvailable = 2, 
    NSStreamEventHasSpaceAvailable = 4, 
    NSStreamEventErrorOccurred = 8, 
    NSStreamEventEndEncountered = 16 
}; 

당신은 그 자체가 일반적으로 스트림에 기입 한 후 곧 occours 때문에 간단하게 (처리되지 않은) 무시이 이벤트. 문제가 발생하면 NSStreamEventErrorOccurred 또는 NSStreamEventEndEncountered이되며 처리해야하는 항목입니다. o.k라는 플래그로 NSStreamEventHasSpaceAvailable을 사용할 수 있습니다. 더 많은 데이터를 보낼 수 있습니다.

두 스트림 (inputStream 및 outputStream)이 동일한 대리인 메서드를 호출하고 있다는 것도 알아야합니다. 그래서 두 개의 NSStreamEventOpenCompleted 이벤트가 시작됩니다. 하지만 다시는 많은 경우 이것이 문제가 될 수 없습니다. 필요한 경우 언제 어떤 스트림이 이벤트의 시작 자인지 확인할 수 있습니다.

+1

감사합니다. 나는 교대 조작원과 혼동되었고 서버도 응답하지 않았다. 그래서 나는 상태 4가 약간의 오류에 대한 것이라고 가정하고 있었다. 나는 지금 상태 4를 무시했다. 서버 측이 수정되면 서버에서 메시지를 검색 할 수있었습니다. 명확히하기 위해 다시 한번 감사드립니다. –

+0

여러분을 환영합니다! –