ios - verificando - GCDAsyncSocket altera los datos mientras los transporta
transferir datos de iphone a iphone (1)
Es debido a esto: el protocolo TCP se basa en el concepto de una única corriente continua de longitud ilimitada. Debe agregar a sus data
algún tipo de indicador de terminación y usar el método readDataToData. O necesita agregar un prefijo a sus data
para la longitud de sus data
. Entonces, cuando usa readDataWithTimeout, puede extraer el número exacto de bytes de la transmisión TCP entrante.
Un ejemplo de cómo usar el terminador del autor de GCDAsynsSocket :
NSString *welcomeMsg = @"Welcome to the AsyncSocket Echo Server/r/n";
NSData *welcomeData = [welcomeMsg dataUsingEncoding:NSUTF8StringEncoding];
[newSocket writeData:welcomeData withTimeout:-1 tag:WELCOME_MSG];
[newSocket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:READ_TIMEOUT tag:0];
La razón por la que no tienes que hacer todo lo mencionado anteriormente con GameKit porque los protocolos de GameKit se encargan de todo eso por ti.
Estoy haciendo un juego de iOS para varios jugadores y me he encontrado con el siguiente problema: envío un diccionario con una serie de objetos personalizados dentro de él. Estos objetos personalizados se ajustan a NSCoding
. Convierte el diccionario a NSData
esta manera:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:packet];
Entonces enviarlo
[asyncSocket writeData:data withTimeout:-1 tag:tag];
Recibir
[sock readDataWithTimeout:-1 tag:tag];
Y tratar de desarchivar
NSDictionary *dict = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Todo parece extremadamente simple, pero la aplicación se bloquea al descomprimir los datos y recibo el siguiente error
[NSKeyedUnarchiver initForReadingWithData:]: archivo incomprensible (0x62, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x30, 0x30) ''
Miré la descripción de los datos enviados y recibidos y encontré que los datos llegan al dispositivo receptor 1) alterados y 2) truncados.
Cuando envío exactamente los mismos datos sobre los protocolos de GameKit, Game Center y Bluetooth, no hay ningún problema como este: recibo los datos sin cambios, por lo que obviamente el problema se encuentra en algún lugar profundo de GCDAsyncSocket.
¿Alguna vez alguien se encontró con tal problema? Gracias