2012-10-10 9 views
8

Ich muss eine Chat-App für iOS mit Socket-Programmierung erstellen und meine IP-Adresse ist 192.168.0.57:9300. Ich habe Raywenderlich Socket Programmierung Beispiel verwendet, Empfangen von Daten ordnungsgemäß funktioniert, aber Senden funktioniert nicht, es gibt keine Fehler oder Absturz. Mein Code ist wie folgt.So senden Sie NSString über Socket mit NSOutputStream

Code zum Öffnen Strom

- (void) initNetworkCommunication { 

    CFReadStreamRef readStream; 
    CFWriteStreamRef writeStream; 
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"192.168.0.57", 9300, &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];  
} 

Code für das Senden von Daten

- (IBAction)sendMessage:(id)sender 
{ 
     NSString *response = @"lets start chat"; 
     NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]]; 
     [outputStream write:[data bytes] maxLength:[data length]]; 
} 

Delegierten

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

    NSLog(@"stream event %i", streamEvent); 

    switch (streamEvent) { 

     case NSStreamEventOpenCompleted: 
      NSLog(@"Stream opened"); 
      break; 
     case NSStreamEventHasBytesAvailable: 

      if (theStream == inputStream) { 

       uint8_t buffer[1024]; 
       int len; 

       while ([inputStream hasBytesAvailable]) { 
        len = [inputStream read:buffer maxLength:sizeof(buffer)]; 
        if (len > 0) { 

         NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding]; 

         if (nil != output) { 

          NSLog(@"\nreciving data------%@,buffer); 

          [self messageReceived:output]; 

         } 
        } 
       } 
      } 
      break; 


     case NSStreamEventErrorOccurred: 

      NSLog(@"Can not connect to the host!"); 
      break; 

     case NSStreamEventEndEncountered: 

      [theStream close]; 
      [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
      [theStream release]; 
      theStream = nil; 

      break; 
     default: 
      NSLog(@"Unknown event"); 
    } 

} 
Message sending 
    - (void) messageReceived:(NSString *)message { 

     [self.messages addObject:message]; 
     [self.tView reloadData]; 
     NSIndexPath *topIndexPath = [NSIndexPath indexPathForRow:messages.count-1 
                 inSection:0]; 
     [self.tView scrollToRowAtIndexPath:topIndexPath 
          atScrollPosition:UITableViewScrollPositionMiddle 
            animated:YES]; 

    } 

bitte geben Sie mir Vorschlag.

+0

Was meinst du mit "es zeigt den Sende-String"? Zeigt der Empfänger es so? Was ist der Empfänger (welche Software, nach Möglichkeit Quell-Snippet)? Wie verarbeiten Sie die empfangene Zeichenfolge? – nullp01nter

+0

Ich habe alle code.server Code in PHP – Suraj

+0

geschrieben Ich habe Ihren genauen Code verwendet, um eine Verbindung zu initialisieren und Netzwerkverkehr von einem iPhone auf meinen Mac zu senden. Die Empfangssoftware ist in Objective C geschrieben und verwendet auch NStreams. Alle übertragenen Strings waren in Ordnung. Ich nehme an, Ihr Problem könnte auf der Serverseite (PHP) sein. Konnten Sie (mit einer anderen Software zum Senden von Zeichenfolgen) überprüfen, ob Ihr Server-Teil funktioniert? – nullp01nter

Antwort

5

Sie sollten die „\ n“ am Ende Ihrer Antwort wie folgt hinzu:

- (IBAction)sendMessage:(id)sender 
{ 
     NSString *response = @"lets start chat\n"; 
     ////your code 
} 

Diese Arbeit für mich, aber mein Problem ist, dass ich keine Daten über die Funktion (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent

+0

Das Hinzufügen von \ n repariert es nicht für mich. Dieses Problem nervt mich wirklich, weil es so einfach ist, die Befehle in Terminal zu senden! Mein Befehl enthält Anführungszeichen, die ich mit \ "markiere", also ist das vielleicht ein Problem? – sudo

1
empfangen kann

Ich hatte ähnliches Problem. Gelöst wurde es, indem Zeilen mit Zeilen- und Zeilenvorschub in die Zeichenfolge eingefügt wurden.

- (IBAction)sendMessage:(id)sender { 

     NSString *response = @"lets start chat\r\n\r\n"; 
     NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]]; 
     [outputStream write:[data bytes] maxLength:[data length]]; 
} 
1

Ich fand das Schreiben eines separaten Threads löste dieses Problem für mich.
Macht Sinn, wie man nicht wirklich Netzwerk-Ops auf dem Haupt-Thread tun sollte.
Hier ist mein Code:

dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), ^(void) { 
    NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]]; 
    NSInteger len = [outputStream write:[data bytes] maxLength:[data length]]; 
    NSLog(@"Len = %ld", len); 
}); 

Ein weiterer Punkt ist zu beachten, dass das NSStreamEventOpenCompleted Ereignis zweimal aufgerufen wird. Einmal, wenn jeder der Eingabe- und Ausgabeströme geöffnet ist. Man muss also darauf achten, nicht vor dem Ereignis in den Ausgabestrom zu schreiben.