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

しかしsongDataartistDataimageDataはすべて 1 つとして受信されます。例は次のとおりです。sn:BURN IT DOWNan:Linkin Park

最初に送信するとimageData、認識されsongDataず、artistData. 私がimageData最後に送信しsongDataartistData一緒につぶされてしまったら、imageData決して認識されません。

4

1 に答える 1

4

データサイズの区切り文字やインジケーターを使用せずに、一連のバイトを送信したようです。自分のように複数のチャンクのデータを送信する場合は、1つのチャンクがどこで終了し、次のチャンクがどこで開始するかを知る方法が必要です。

一般的なアプローチの1つは、長さを送信してからデータを送信することです。長さはバイト数になり、これは常に4バイトまたは8バイトになります。これはすべてsendData:error:メソッドで処理されます。

受信側では、長さを表す4バイトまたは8バイトを読み取り、次にlengthバイトを読み取ります。

最後に、次のデータを送信します。

  1. 曲のデータ長
  2. 曲データ
  3. アーティストデータの長さ
  4. アーティストデータ
  5. 画像データの長さ
  6. 画像データ
于 2013-02-09T19:22:12.693 に答える