2013-02-09 3 views
0

J'envoyer des données sur Bonjour:NSData fusionné?

NSString *songString = [NSString stringWithFormat:@"sn:%@", [bHelp song]]; 
NSString *artistString = [NSString stringWithFormat:@"an:%@", [bHelp artist]]; 
NSData *imageData = [self PNGRepresentationOfImage:[bHelp getArtwork]]; 
NSData *songData = [songString dataUsingEncoding:NSUTF8StringEncoding]; 
NSData *artistData = [artistString dataUsingEncoding:NSUTF8StringEncoding]; 
[self.server sendData:songData error:nil]; 
[self.server sendData:artistData error:nil]; 
[self.server sendData:imageData error:nil]; 

ensuite reçu:

NSString *message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
UIImage *image = [[UIImage alloc] initWithData:data]; 
if (message != nil) { 
    NSLog(message); 
    if ([message hasPrefix:@"sn:"]) { 
     _songName = [message stringByReplacingOccurrencesOfString:@"sn:" withString:@""]; 
    } else if ([message hasPrefix:@"an:"]) { 
     _artistName = [message stringByReplacingOccurrencesOfString:@"an:" withString:@""]; 
    } 
    return; 
} 

if (image != nil) { 
    self.albumImage = image; 
    return; 
} 

Mais songData, artistData et imageData sont tous reçus comme l'un. Un exemple serait: sn:BURN IT DOWNan:Linkin Park

Si j'envoie imageData d'abord, il ne reconnaît songData et artistData. Si j'envoie imageData dernier, songData et artistData sont regroupés et imageData n'est jamais reconnu.

Répondre

4

Il semble que vous venez d'envoyer une série d'octets sans délimiteur ou indicateur de la taille des données. Si vous voulez envoyer plusieurs blocs de données comme vous l'êtes, vous avez besoin d'un moyen de savoir où s'arrête un bloc et où le suivant commence.

Une approche courante consisterait à envoyer une longueur, puis les données. La longueur serait le nombre d'octets et ce serait toujours 4 ou 8 octets. Tout cela serait traité dans la méthode sendData:error:. Du côté de la réception, vous devriez lire les 4 ou 8 octets représentant la longueur, alors vous devriez lire length octets.

En fin de compte, vous enverriez les données suivantes:

  1. longueur des données de morceau
  2. données de morceau
  3. artiste longueur des données
  4. données artiste
  5. l'image longueur des données
  6. l'image données
+0

Quelle est la raison pour laquelle il y a un appel de méthode avec toutes les données par rapport à plusieurs appels avec chaque paquet envoyé? @rmaddy – vqdave