Получить изображение на iPhone (TCP-клиент) - PullRequest
4 голосов
/ 26 февраля 2012

Я программирую клиента на iPhone.Я хочу отправить несколько строк и получить изображение с сервера.

Я нашел этот урок (http://www.devx.com/wireless/Article/43551), он был очень полезен. Он работает, если я хочу получать строки, но теперь я хочу получитьизображение, и я не могу заставить его работать.

Это мой код, когда iPhone получает данные. Это микс, сделанный с помощью учебника и этого ответа от JeremyP (http://stackoverflow.com/questions/4613218):

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {

switch(eventCode) {
    case NSStreamEventHasBytesAvailable: {
        if (data == nil) {
            data = [[NSMutableData alloc] init];
        }
        uint8_t buf[102400];
        unsigned int len = 0;
        len = [(NSInputStream *)stream read:buf maxLength:102400];

        if(len) {    
            [data appendBytes:(const void *)buf length:len];

            // Recibir img
    uint8_t size;  // Let's make sure size is an explicit width.

            NSInteger totalBytesRead = 0;
            NSInteger bytesRead = [iStream read: &size maxLength: sizeof size];
            while (bytesRead > 0 && totalBytesRead + bytesRead < sizeof size) {
                totalBytesRead+= bytesRead;
                bytesRead = [iStream read: &size + totalBytesRead maxLength: (sizeof size) - totalBytesRead];
            }
            if (bytesRead >= 0) {
                totalBytesRead += bytesRead;
            }
            else {
                // read failure, report error and bail
            }
            if (totalBytesRead < sizeof size) {
                // connection closed before we got the whole size, report and bail
            }
            size = ntohl(size);  // assume wire protocol uses network byte ordering

            NSMutableData* buffer = [[NSMutableData alloc] initWithLength: size];
            totalBytesRead = 0;
            bytesRead = [iStream read: [buffer mutableBytes] maxLength: size];
            while (bytesRead > 0 && totalBytesRead + bytesRead < size) {
                totalBytesRead+= bytesRead;
                bytesRead = [iStream read: [buffer mutableBytes] + totalBytesRead maxLength: size - totalBytesRead];
            }
            if (bytesRead >= 0) {
                totalBytesRead += bytesRead;
            }
            else {
                // read failure, report error and bail (not forgetting to release buffer)
            }
            if (totalBytesRead < size) {
                // connection closed before we got the whole image, report and bail (not forgetting to release buffer)
            }
            else {
                [buffer setLength: size];
            }

            imgResultado.image = [UIImage imageWithData: buffer];
            [buffer release];
            [data release];        
            data = nil;

        } 
        else {
            NSLog(@"No data.");
        }


    } break;
}}

Это не работает ... не могли бы вы мне помочь?

Ответы [ 2 ]

3 голосов
/ 26 февраля 2012

Ну, я заставил это работать таким образом, но я не уверен, есть ли лучший способ.

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
switch(eventCode) {
    case NSStreamEventHasBytesAvailable:
    {
        uint32_t max_size = 1000000;  // Max size of the received imaged.
        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];
            imgResultado.image = [UIImage imageWithData: buffer];
            [buffer release];
        }
    } break;
}}

При использовании этого метода полученное изображение должно быть меньше, чем max_size. Если вы знаете лучший способ сделать это, пожалуйста, дайте мне знать! ;)

0 голосов
/ 26 февраля 2012

Если все, что вам нужно сделать, это загрузить изображение с сервера для отображения, взгляните на это:

https://github.com/michaelkamprath/iPhoneMK/tree/master/Views/MKNetworkImageView

Существует множество встроенных функций дляiOS, которая будет обрабатывать загрузку изображений для вас.То есть, если вы можете инкапсулировать объекты, которые вы хотите загрузить, в виде отдельных URL-адресов (например, веб-сервер).

Если, однако, вы пытаетесь отправлять и получать данные через одно и то же TCP-соединение, я быНастоятельно рекомендуем вам перейти на более RESTful подход.Отчасти потому, что это легче реализовать на стороне клиента, отчасти потому, что вам не нужно беспокоиться (столько) о базовом TCP-соединении.

...