2011-07-01 15 views
1

次のコードを使用して、サーバーに接続し、イベントを処理します。
ほとんどコピー貼り付けのhttp://www.devx.com/wireless/Article/43551(iphone)どのようにクローズソケットストリームを強制するには?

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

ストリームが上にスケジュールされたスレッド/実行ループの次のメソッドを実行扱うありがとう:

- (void)closeStream:(NSStream *)stream { 
      [stream close]; 
      [stream removeFromRunLoop:[NSRunLoop currentRunLoop] 
        forMode:NSDefaultRunLoopMode]; 
      [stream release]; 
      stream = nil; 
    } 
+0

これは私のために働いていないようです..任意のアイデア? – Roshit

+0

詳細/コード – ZhangChn

+0

を上記のコードと同じ部分を提供しないかどうかはわかりません。私が直接self.inputStreamとself.outputStreamを使用したという事実を除いて...自己の使用法は問題になりますか? – Roshit

関連する問題