我通过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
,artistData
和imageData
都是一起收到的。一个例子是:sn:BURN IT DOWNan:Linkin Park
如果我先发送imageData
,则永远不会识别songData
和artistData
。如果我最后发送imageData
,则songData
和artistData
会合在一起,imageData
永远不会被识别。
答案 0 :(得分:4)
看起来你只是发送了一系列字节,没有分隔符或数据大小的指示符。如果你想像你一样发送多个数据块,你需要一种方法来判断一个块结束和下一个块的开始。
一种常见的方法是发送长度,然后发送数据。长度将是字节数,这将始终是4或8个字节。这将全部用sendData:error:
方法处理。
在接收端,您将读取表示长度的4或8个字节,然后您将读取length
个字节。
最后,您将发送以下数据: