2009-04-29 13 views
4

NSStreamオブジェクトを使用してソケットを開いて書き込みしようとしていますが、問題があります。NSOuputStream複数回書く

ソケットを開いた後に、ソケットに書き込む方法がわかりません。

NSURL *website = [NSURL URLWithString:urlStr]; 
     if (!website) { 
      NSLog(@"%@ is not a valid URL"); 
      return; 
     } 
     NSHost *host = [NSHost hostWithName:urlStr]; 
     // iStream and oStream are instance variables 
     [NSStream getStreamsToHost:host port:6667 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]; 
     [iStream open]; 
     [oStream open]; 

2)ループを設定し:ここ

は、第1のソケットをopenning)iは

1を行っている方法である

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

    if (theStream == iStream) io = @">>"; 
    else io = @"<<"; 
    NSLog(@"stream : %@",theStream); 

    NSString *event; 
    switch (streamEvent) 
    { 
     case NSStreamEventNone: 
      event = @"NSStreamEventNone"; 
      break; 
     case NSStreamEventOpenCompleted: 
      event = @"NSStreamEventOpenCompleted"; 
      break; 
     case NSStreamEventHasBytesAvailable:{ 
      event = @"NSStreamEventHasBytesAvailables"; 
      if (theStream == iStream) 
      { 
       if(!_data) { 
        _data = [[NSMutableData data] retain]; 
       } 
       uint8_t buf[1024]; 
       unsigned int len = 0; 
       len = [iStream read:buf maxLength:1024]; 
       NSLog(@"Lenght data read : %d", len); 
       if(len) { 
        NSData * dataReceived= [[NSString stringWithFormat:@"%s\n", (char *)buf] dataUsingEncoding:NSUTF8StringEncoding]; 
        NSString *s = [[NSString alloc] initWithData:dataReceived encoding:NSUTF8StringEncoding]; 
        NSLog(@"Received _data: \"%@\"\n",s); 



       } else { 
        NSLog(@"nothing to read!"); 
       } 
      }else { 
       NSLog(@"Not the good stream"); 
      } 

      break; 
     } 

     case NSStreamEventHasSpaceAvailable:{ 
      event = @"NSStreamEventHasSpaceAvailable"; 
      if (theStream == oStream) 
      { 
       if(isConnexionCommandSent == NO){ 
        [self sendCommand:@"My connection command"];  
        isConnexionCommandSent = YES; 
       } 

      } 

      break; 
     } 

     case NSStreamEventErrorOccurred: 
      event = @"NSStreamEventErrorOccurred"; 
      NSError *theError = [theStream streamError]; 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:[theError localizedDescription] 
                  delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; 
      [alert show]; 
      [alert release]; 
      break; 
     case NSStreamEventEndEncountered: 
      event = @"NSStreamEventEndEncountered"; 

      break; 
     default: 
      event = @"** Unknown"; 
    } 

    NSLog(@"%@ : %@", io, event); 
} 

3)次に、iがある機能を有しますボタンに触れると呼び出される

- (IBAction)join:(id)sender{ 
    if([oStream hasSpaceAvailable]){ 
     NSLog(@"iStream Status : %d",[iStream streamStatus]); 
     NSLog(@"oStream Status : %d",[oStream streamStatus]); 
     [self sendCommand:@"join"]; 

    }else{ 
     NSLog(@"Error command can't be sent");  
    } 
} 

-(void) sendCommand:(NSString *) command{ 
    NSLog(@"space : %d",[oStream hasSpaceAvailable]); 
    if ([oStream hasSpaceAvailable]) 
    { 
     NSLog(@"Command writen : %s\n",[command cStringUsingEncoding:NSASCIIStringEncoding]); 
     NSInteger i=[oStream write:(const uint8_t *)[command cStringUsingEncoding:NSASCIIStringEncoding] maxLength:(NSInteger)[command lengthOfBytesUsingEncoding:NSASCIIStringEncoding]]; 
     if (i<0) 
     { 
      NSLog(@"erreur lors de l'envoi, status:%i, erreur:%@", [oStream streamStatus], [oStream streamError]); 
     } 
     isReadyToSend = NO; 
    } 

    else 
    { 
     NSLog(@"impossible d'envoyer, status:%i, erreur:%@", [oStream streamStatus], [oStream streamError]); 
    } 
} 

しかし、問題は、関数が呼び出された参加するときに、すべてが正常になりますが、サーバは何も受信しないことです...

NSInteger i=[oStream write:(const uint8_t *)[command cStringUsingEncoding:NSASCIIStringEncoding] maxLength:(NSInteger)[command lengthOfBytesUsingEncoding:NSASCIIStringEncoding]]; 

i>は0であるので、私は書き込みを行ったと仮定しますまあ、サーバー上に何も受信されません...私は理由を知らない...

私を助けることができますか?

+0

'[self sendCommand:@ "My connection command"];'成功? 'write'が成功した場合、これはクライアントのTCPスタックがこれらのバイトを配信しようとしていることを意味します。しかし、tcp接続が終了した場合、それは配信されません。あなたはデータが受信されていないと確信していますか?これをどのように確認しましたか? –

答えて

0

Hey @Ptitaw this postを参照してください。私は、あなたがあなたの答えを見つけて、簡単に接続し、すべてのイベント(読み込み、書き込みなど)に自動的にアクセスできると信じています。

0

しかし、同様の問題を抱えている人に役立つかもしれません。

データの暗号化メカニズムが原因と考えられます。サーバーがUTF-8エンコーディングを使用していて、NSASCIIStringEncodingを使用してデータを送信している可能性があります。これを試してください:

NSInteger i=[oStream write:(const uint8_t *)[command cStringUsingEncoding:NSUTF8StringEncoding] maxLength:(NSInteger)[command lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];