(iphone) как принудительно закрыть сокетный поток? - PullRequest
1 голос
/ 01 июля 2011

Я использую следующий код для подключения к серверу и обработки событий.
почти копирование-вставка http://www.devx.com/wireless/Article/43551

Я хочу принудительно закрыть поток до того, как NSStreamEventEndEncountered.
Документация отсутствует итрудно понять, как принудительно закрыть потоки, связанные с подключением.(или закройте основной сокет, если мне нужно)

Спасибо

-(void) connectToServerUsingStream:(NSString *)urlStr
                            portNo: (uint) portNo {

    if (![urlStr isEqualToString:@""]) {
        NSURL *website = [NSURL URLWithString:urlStr];
        if (!website) {
            NSLog(@"%@ is not a valid URL");
            return;
        } else {
            [NSStream getStreamsToHostNamed:urlStr
                      port:portNo
                      inputStream:&iStream
                      outputStream:&oStream];
            [iStream retain];
            [oStream retain];

            [iStream setDelegate:self];
            [oStream setDelegate:self];

            [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                     forMode:NSDefaultRunLoopMode];
            [oStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                     forMode:NSDefaultRunLoopMode];

            [oStream open];
            [iStream open];
        }
    }
}

и обрабатывает событие

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {

    NSLog(@"stream event %d", eventCode) ;
    if( stream == iStream ) NSLog(@"on input stream");
    else if( stream == oStream ) NSLog(@"on output stream");
    else NSLog(@"on unknown stream identifier") ;

    switch(eventCode) {
        case NSStreamEventEndEncountered:
            {
                NSLog(@"stream ended; will be closed") ;
                [stream close];
                [stream removeFromRunLoop:[NSRunLoop currentRunLoop]
                        forMode:NSDefaultRunLoopMode];
                [stream release];
                stream = nil; // stream is ivar, so reinit it                                                                                                                                                                                                                 

                break;
            }
        case NSStreamEventErrorOccurred:
            NSLog(@"stream error") ;
            break ;

        case NSStreamEventHasBytesAvailable:
            //TODO: read here                                                                                                                                                                                                                                                 
            break ;

        case NSStreamEventNone:
            NSLog(@"stream null event") ;
            break ;

        case NSStreamEventOpenCompleted:
            NSLog(@"stream is now open") ;
            break ;

        case NSStreamEventHasSpaceAvailable:
            //write here                                                                                                                                                                                                                                                      
            break ;
    }

}

1 Ответ

1 голос
/ 01 июля 2011

Выполните следующий метод в потоке / цикле выполнения, для которого запланирован поток:

    - (void)closeStream:(NSStream *)stream {
          [stream close];
          [stream removeFromRunLoop:[NSRunLoop currentRunLoop]
                  forMode:NSDefaultRunLoopMode];
          [stream release];
          stream = nil;
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...