2012-07-23 4 views
0

저는 객관적인 C 및 ios 개발에 익숙하지 않습니다. 나는 일반적으로 Java로 Android 앱을 프로그래밍하고 onPause 호출을 사용하여 소켓을 닫습니다. 그러나 applicationWillResignActive에서 close 메소드를 호출하면 스트림 리스너와의 통신이 느슨해지며 입력 및 출력 스트림을 닫을 수 없습니다. 사실 앱이 서버에 연결되어 있어도 두 스트림의 스트림 상태는 NSStreamStatusNotOpen 또는 0을 표시합니다. 어떤 아이디어? 앱이 백그라운드로 이동하면 NSStream을 닫습니다.

는 SocketHandler.m 클래스 당신에게

편집

연결 방법을 감사합니다

-(void)connect:(int *)port ipAddress:(NSString *)ipAddress 
{ 
     CFReadStreamRef readStream; 
     CFWriteStreamRef writeStream; 
     CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)ipAddress, port, &readStream, &writeStream); 
     inputStream = (NSInputStream *)readStream; 
     outputStream = (NSOutputStream *)writeStream; 
     [inputStream setDelegate:self]; 
     [outputStream setDelegate:self]; 
     [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
     [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
     [inputStream open]; 
     [outputStream open]; 
     NSLog(@"input stream id %i", inputStream); 
} 

-(void)disconnect{ 

    NSLog(@"disconnect method called"); 

    socketStatus = [outputStream streamStatus]; 
    int status = socketStatus; 
    NSLog(@"Stream Status is %i", status); 

    if (status == 2) { 
     [inputStream close]; 
     [outputStream close]; 
     NSLog(@"Socket Closed"); 
    } 



} 
+0

조금 더 자세히 설명해 주시겠습니까? 'NSStream'에'close :'를 보내면 그것을 닫고 대리자'stream : handleEvent :'를 보내야합니다. – arbales

+0

나는 문제가 내 AppDelegate에서 NSInputStream 및 NSOutputStream 객체에 액세스 할 수 없다고 생각합니다. 연결 및 연결 끊기 메서드가있는 SocketHandler라는 클래스가 있습니다. UI의 단추에서 연결 및 연결 끊기 메서드를 호출합니다. 그러나 응용 프로그램 위임에 applicationwillresignactive 연결 끊기 메서드를 호출 할 때 응용 프로그램에서 다른 모든 클래스를 수 있기 때문에 그것을 위조 수 스트림 개체를 액세스 할 수없는 역할을합니다. –

+0

버튼에 연결하는 SocketHandler 객체를 어떻게 만들었습니까? 앱 위임자로부터이 객체를 어떻게 발견합니까? –

답변

0

그래, 여기에 내 자신의 질문에 대한 대답입니다. 내가 연결하고 다른라는 분리라는 방법을 가지고있는 소켓 핸들러 클래스 내부

TCPSocketAppDelegate TCPSocketViewController 소켓 핸들러

:

나는 3 개 클래스를 만들었습니다. 여기에 그들이있다 :

연결 방법 :

-(void)connect:(int *)port ipAddress:(NSString *)ipAddress 
{ 
     NSLog(@"input stream id %i", inputStream); 
     CFReadStreamRef readStream; 
     CFWriteStreamRef writeStream; 
     CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)ipAddress, port, &readStream, &writeStream); 
     inputStream = (NSInputStream *)readStream; 
     outputStream = (NSOutputStream *)writeStream; 
     [inputStream setDelegate:self]; 
     [outputStream setDelegate:self]; 
     [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
     [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
     [inputStream open]; 
     [outputStream open]; 
     NSLog(@"input stream id %i", inputStream); 
} 

분리 방법 :

-(void)disconnect{ 

    NSLog(@"disconnect method called"); 
    NSLog(@"input stream id %i", inputStream); 

    socketStatus = [outputStream streamStatus]; 
    int status = socketStatus; 
    NSLog(@"Stream Status is %i", status); 

    if (status == 2) { 
     [inputStream close]; 
     [outputStream close]; 
     NSLog(@"Socket Closed"); 
    } 



} 

내가 다음 TCPSocketAppDelegate 클래스의 소켓 핸들러 클래스와 TCPSocketView 컨트롤러 클래스에 참조 개체를 만들었습니다. 그러나이 작업을 수행 할 때 각각 SocketHandler 클래스의 새 인스턴스가 만들어져 동일한 소켓을 처리하지 못해 소켓 하나를 연결할 수 있지만 다른 소켓은 연결할 수 없습니다. 이 문제를 해결하기 위해 단순히 + (void)를 사용하여 전역 적으로 액세스 할 수있는 연결 및 연결 해제 방법을 만들었습니다. 이제 메소드를 호출하기 위해 다른 클래스에서 참조 객체를 작성하지 않아도됩니다. 이 정보가 누군가 길을가는 데 도움이되기를 바랍니다.