2010-06-21 9 views
6

Estoy tratando de agregar una característica simple a mi aplicación, simplemente debería enviar una cadena preformateada a otro dispositivo, muy parecido al código de muestra WiTap. Suena como una cosa muy trivial para hacerlo, pero no puedo conseguir que funcione;. (¿Cómo puedo modificar WiTap enviar una cadena en lugar de un único intiPhone SDK enviar cadena a través de wifi

Cualquier punteros a buenos tutoriales serían grandes

?.

Miré el ejemplo de SimpleNetworkStreams, pero se me pasó por la cabeza ya que solo estoy buscando enviar una cadena (NSString, char [], no tengo una preferencia) y no un archivo.

Mirado este ejemplo también: How to add data for NSOutputStream? pero eso tampoco ayudó completamente.

+0

Se supone que acaba de pasar algo como (const uint8_t *) [strBuffer UTF8String]; donde strBuffer es un NSString para que el búfer escriba? – SaltyNuts

Respuesta

4

Desde entonces lo he descubierto y he decidido responder mi propia pregunta h Es para el beneficio de aquellos que se encuentran en una situación similar.

Siempre que quiero enviar cualquier cadena, utilizo esta función auxiliar que creé:

- (void) send:(NSString *)string { 
    const uint8_t *message = (const uint8_t *)[string UTF8String]; 
    if (_outStream && [_outStream hasSpaceAvailable]) 
     if([_outStream write:message maxLength:strlen((char *)message)] == -1) 
      NSLog(@"Failed sending data to peer"); 
} 

En el lado receptor se ve así:

- (void) stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode { 

    switch(eventCode) { 

    case NSStreamEventHasBytesAvailable: 
    { 
     if (stream == _inStream) { 
      // read it in 
      unsigned int len = 0; 
      len = [_inStream read:buf maxLength:buffSize]; 
      buf[len] = '\0'; 
      if(!len) { 
       if ([stream streamStatus] != NSStreamStatusAtEnd) 
         NSLog(@"Failed reading data from peer"); 
      } else { 
       NSString *message = [NSString stringWithUTF8String:(char *)buf]; 
       // here you do whatever you need with your received NSString *message 
      } 
     } 
    } 
} 

El tampón se define como:

#define buffSize 60000 
uint8_t buf[buffSize]; 

60,000 es bastante arbitrario, puede cambiarlo para adaptarlo a sus necesidades.

Algunas notas sobre lo anterior. Si bien es seguro hacer que el buffer para estas cadenas sea bastante grande, nunca se garantiza que recibirá su cadena de una sola vez. En la aplicación real, debe diseñar cuidadosamente un protocolo determinado en el que pueda confiar para verificar si recibió toda la cadena y combinar las cadenas recibidas durante los siguientes NSStreamEvent s si es necesario.

Cuestiones relacionadas