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