2009-04-29 6 views
4

Ich versuche, die NStream-Objekte zu öffnen und dann auf einem Socket schreiben und lesen, aber ich habe ein Problem.NSOuputStream mehrmals schreiben

Ich weiß nicht, wie man auf den Sockel schreibt, nachdem ich es geöffnet habe.

Hier ist, wie i

getan haben

1) zuerst die Buchse openning:

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) Stellen Sie die Schleife:

- (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 haben dann eine Funktion, die ist wenn ich einen Knopf berühre

- (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]); 
    } 
} 

Aber das Problem ist, dass beim Aufruf der Funktion Join, alles gut geht, aber der Server erhält nichts ...

Auf

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

i> 0 ist, so nehme ich an, dass das Schreiben ging naja, aber auf dem server wird nichts empfangen ... ich weiß nicht warum ...

Kannst du mir helfen?

+0

Ist der '[send sendCommand: @ "Mein Verbindungsbefehl"];' gelingen? Wenn das 'Schreiben' erfolgreich ist, bedeutet das, dass der Client-TCP-Stapel jetzt versucht, diese Bytes zu liefern. Aber wenn die TCP-Verbindung gestorben ist, wird sie nicht zugestellt. Sind Sie sicher, dass die Daten nicht empfangen wurden, wie haben Sie dies verifiziert? –

Antwort

0

Hey @Ptitaw siehe this post. Ich glaube da findest du vielleicht deine Antwort und einen einfacheren Weg sich zu verbinden und bekomme automatisch Zugriff auf alle Ereignisse (lesen, schreiben, etc ..) hoffe ich könnte helfen :)

0

Eine sehr sehr späte Antwort, allerdings, es könnte für jemanden mit ähnlichen Problemen hilfreich sein.

Ich denke, dass es aufgrund der Datencodierung Mechanismus sein kann. Ihr Server verwendet möglicherweise UTF-8-Codierung und Sie senden Ihre Daten mit NSASCIIStringEncoding. Versuchen Sie dies:

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