0

我通过 Bonjour 发送一些数据:

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

但是songData,artistDataimageData都作为一个接收。一个例子是:sn:BURN IT DOWNan:Linkin Park

如果我imageData先发送,它永远不会识别songDataartistData. 如果imageData最后送,songDataartistData在一起,imageData绝对不被承认的话。

4

1 回答 1

4

看来您只是发送了一系列没有分隔符或数据大小指示符的字节。如果你想像你一样发送多个数据块,你需要一种方法来判断一个块在哪里结束,下一个块从哪里开始。

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

在接收端,您将读取代表长度的 4 或 8 个字节,然后您将读取length字节。

最后,您将发送以下数据:

  1. 歌曲数据长度
  2. 歌曲数据
  3. 艺术家数据长度
  4. 艺人资料
  5. 图像数据长度
  6. 图像数据
于 2013-02-09T19:22:12.693 回答