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 图像将在一个块中传输,并且您只需发生一次“HasBytesAvailable”事件即可读取它。但是,您还应该考虑将 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 回答