0

C# サーバーから jpeg 画像を受信しようとしています。奇妙なことに、デバッガーで実行すると、メソッドのどこかにブレークポイントがあり、完全に正常に動作します。ブレークポイントがないと、このエラーが発生します

破損した JPEG データ: データ セグメントの途中終了

これが私のコードです

(void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
NSMutableData *data;
data = [NSMutableData new];
switch(eventCode) {
    case NSStreamEventHasBytesAvailable:
    {
        uint8_t buffer[1024];
        int len;

        while([inputStream hasBytesAvailable]) {
            len = [inputStream read:buffer maxLength:sizeof(buffer)];

            if (len > 0)
            {
                [data appendBytes:(const void*)buffer length:sizeof(buffer)];
            }
        }
        UIImage *images = [[UIImage alloc]initWithData:data];
        [dvdCover setImage:images];
    } break;
    case NSStreamEventEndEncountered:
    {
        //UIImage *images = [[UIImage alloc]initWithData:data];
        //[dvdCover setImage:images];


    } break;
}

}

4

2 に答える 2

0

JPEG画像全体が1つのチャンクで転送されると想定しているようで、「HasBytesAvailable」イベントが1回発生するだけで読み取ることができます。ただし、JPEG 画像が複数のチャンクで転送される場合も考慮する必要があります。

コードの実行がどこかで停止する可能性があり、ネットワーク バッファーには画像のすべてのバイトを受信する十分な時間があったため、ブレークポイントを設定するとうまくいく可能性があります。しかし、ブレークポイントがなければ、そうする時間がないかもしれません。

バイト チャンクを蓄積するようにコードをリファクタリングしてみてください。すべてのバイトが転送されたときに完了したと想定してください。(通常、画像が何バイトになるかを事前に知っておく必要があります-または、ストリームイベントの終了をキャプチャできます)

于 2013-01-25T05:39:11.473 に答える
0
hi you can check this code hop it will help you...

case NSStreamEventHasBytesAvailable:
{

uint32_t max_size = 1000000;  // Max size of the received imaged you can modify it as your reqirement.
        NSMutableData* buffer = [[NSMutableData alloc] initWithLength: max_size];
        NSInteger totalBytesRead = 0;
        NSInteger bytesRead = [(NSInputStream *)stream read: [buffer mutableBytes] maxLength: max_size];
        if (bytesRead != 0) {
            while (bytesRead > 0 && totalBytesRead + bytesRead < max_size) {
                totalBytesRead+= bytesRead;
                bytesRead = [(NSInputStream *)stream read: [buffer mutableBytes] + totalBytesRead maxLength: max_size - totalBytesRead];
            }
            if (bytesRead >= 0) {
                totalBytesRead += bytesRead;
            }
            else {
                // read failure, report error and bail (not forgetting to release buffer)
            }
            [buffer setLength: totalBytesRead];
            yourImageName.image = [UIImage imageWithData: buffer];
            [buffer release];

}  break;
于 2013-01-25T06:25:03.277 に答える