2012-10-10 24 views
8

Tengo que crear una aplicación de chat para iOS usando la programación de socket y mi dirección IP es 192.168.0.57:9300. He usado el ejemplo de programación de socket Raywenderlich, recibiendo datos funcionando correctamente pero el envío no funciona, no hay ningún error o fallo. Mi código es el siguiente.Cómo enviar NSString a través de un socket usando NSOutputStream

código

para la apertura arroyos código

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

para el envío de datos

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

delegados

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

    } 

por favor me proporcione sugerencia.

+0

¿Qué quiere decir con "muestra la cadena de envío"? ¿Lo muestra el receptor así? ¿Qué es el receptor (qué software, fragmento de código fuente si es posible)? ¿Cómo se procesa la cadena recibida? – nullp01nter

+0

He adjuntado todo el código. El código del servidor está escrito en php – Suraj

+0

Utilicé su código exacto para inicializar una conexión y para enviar tráfico de red desde un iPhone a mi Mac. El software receptor está escrito en Objective C y también usando NSStreams. Todas las cadenas transmitidas estaban bien. Supongo que su problema podría estar en el lado del servidor (PHP). ¿Ha podido verificar (con otro software para enviar cadenas) que la parte del servidor está funcionando? – nullp01nter

Respuesta

5

Usted debe agregar el "\ n" al final de su respuesta como esta:

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

Este trabajo para mí, pero mi problema es que no puedo recibir datos utilizando la función (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent

+0

Agregar \ n no me lo arregla. ¡Este problema realmente me está molestando porque es tan simple enviar los comandos en la Terminal! Mi comando tiene comillas que marcan con \ ", ¿entonces tal vez sea un problema? – sudo

1

Tuve un problema similar. Se solucionó añadiendo caracteres de nueva línea y avance de línea en una cadena.

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

Encontré escribir un hilo separado que resolvió este problema para mí.
Tiene sentido ya que uno no debería realmente hacer operaciones de red en el hilo principal.
Aquí está mi código:

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

Otro punto a destacar es que el evento NSStreamEventOpenCompleted se llama dos veces. Una vez que cada uno de los flujos de entrada y salida se abren. Entonces uno debe tener cuidado de no escribir en la secuencia de salida antes de su evento.

Cuestiones relacionadas