2012-10-10 9 views
8

Devo creare un'app di chat per iOS utilizzando la programmazione socket e il mio indirizzo IP è 192.168.0.57:9300. Ho usato l'esempio di programmazione socket Raywenderlich, ricevendo dati funzionanti correttamente ma inviando non funzionante, non ci sono errori o crash. Il mio codice è come segue.Come inviare NSString tramite socket utilizzando NSOutputStream

codice

per l'apertura flussi codice

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

per l'invio dei dati

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

delegati

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

    } 

si prega di fornire me suggestione.

+0

Cosa intendi con "mostra la stringa di invio"? Il ricevitore lo mostra così? Qual è il destinatario (quale software, se possibile snippet post sorgente)? Come si elabora la stringa ricevuta? – nullp01nter

+0

Ho allegato tutti i codici code.server sono scritti in php – Suraj

+0

Ho usato il tuo codice esatto per inizializzare una connessione e per inviare traffico di rete da un iPhone al mio Mac. Il software di ricezione è scritto nell'obiettivo C e utilizza anche NSStreams. Tutte le stringhe trasmesse erano OK. Immagino che il tuo problema potrebbe essere sul lato server (PHP). Sei stato in grado di verificare (con un altro software per inviare stringhe) che la tua parte server sta funzionando? – nullp01nter

risposta

5

Si dovrebbe aggiungere il "\ n" alla fine della vostra risposta in questo modo:

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

questo lavoro per me, ma il mio problema è che non riesco a ricevere i dati tramite la funzione (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent

+0

L'aggiunta di \ n non risolve il problema per me. Questo problema mi disturba molto perché è così semplice inviare i comandi nel Terminale! Il mio comando ha delle virgolette che segnano con \ ", quindi forse questo è un problema? – sudo

1

Ho avuto un problema simile. È stato risolto aggiungendo il carattere di nuova riga e di avanzamento riga nella stringa.

- (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

Ho trovato che scrivere un thread separato ha risolto questo problema per me.
Ha senso perché non si dovrebbero realmente fare operazioni di rete sul thread principale.
Ecco il mio codice:

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

Un altro punto da notare è che l'evento NSStreamEventOpenCompleted viene chiamato due volte. Una volta quando ciascuno dei flussi di input e output viene aperto. Quindi bisogna stare attenti a non scrivere sul flusso di output prima del suo evento.

Problemi correlati