2013-02-09 79 views
0

我通过Bonjour发送一些数据:NSData合并在一起?

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

然后接受它:

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

songDataartistDataimageData都收到一个。一个例子是:sn:BURN IT DOWNan:Linkin Park

如果我先发送imageData,它永远不会识别songDataartistData。如果我最后送imageDatasongDataartistData被捣成泥一起imageData决不会被识别。

回答

4

看样子你只是发送一系列字节,没有数据大小的分隔符或指示。如果你想发送多个数据块像你这样,你需要一种方法来告诉其中一个块结束和下一个开始。

一种常见的方法是发送一个长度,然后将数据。长度将是字节数,并且总是4或8个字节。这将全部在sendData:error:方法中处理。

在接收端,你会读代表长度的4或8个字节,那么,你会读length字节。

最后,你会发送以下数据:

  1. 歌曲数据长度
  2. 歌曲数据
  3. 艺术家的数据长度
  4. 艺术家数据
  5. 图像数据长度
  6. 图像数据
+0

为什么有一个方法调用所有数据与多个调用与每个发送的数据包? @rmaddy – vqdave 2013-02-09 20:29:41