2013-02-09 54 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