В программировании iPhone, как я могу получить файл изображения с TCP / IP с сервера, на котором установлена ​​ОС XP? - PullRequest
4 голосов
/ 06 января 2011

Я делаю приемник изображений с iPhone.

Сервер отправляет файл изображения с байтом.

, и я попытался создать этот байт для изображения.

Но,Я не могу сделать изображение.уже несколько дней назад ...

мне действительно нужна ваша помощь ...

это исходный код, который я использую.

        Byte recvBuffer[500];

        memset(recvBuffer, '\0', sizeof(recvBuffer));
        [iStream read:recvBuffer maxLength:sizeof(recvBuffer)-1];

        NSUInteger len = sizeof(recvBuffer);
        NSData *webdata = [NSData dataWithBytes:recvBuffer length:len];
        imageview.image = [UIImage imageWithData:webdata];

, если вы дадите комментарий, я действительно ценю!спасибо за чтение!

Ответы [ 2 ]

3 голосов
/ 06 января 2011

ответ барсука, по сути, тот, который я бы использовал, но, поскольку вопрос помечен Objective-C, код должен быть действительно в Objective-C - что-то вроде следующего.Обратите внимание, что по соединению TCP / IP -read: maxLength: может возвращаться до того, как будет прочитано запрошенное количество байтов.

uint32_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)
{
    totalBytes+= 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)
{
    totalBytes+= bytesRead;
    bytesRead = [istream read: (char*)[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];
}

imageView.image = [UIImage imageWithData: buffer];
[buffer release];

Я набрал вышеизложенное прямо в SO, так что оно не тестируется илидаже скомпилировано.

2 голосов
/ 06 января 2011

TCP / IP - это протокол, который не зависит от ОС, поэтому тот факт, что вы используете XP на сервере, не должен влиять ни на что, кроме возможного использования Windows API для операций с сокетами.

Клаус Брох прав, говоря, что 499 байт выглядит немного меньше для изображения. Вместо этого я предлагаю сначала найти общий размер изображения (в байтах) на сервере, затем отправить это значение в начале потока TCP, а затем данные изображения. На принимающей стороне ваш код должен сначала прочитать это значение размера, выделить немного памяти такого размера, а затем прочитать столько байтов в него. Вы не опубликовали свой серверный код, поэтому я не могу с этим помочь, но клиент может выглядеть примерно так:

    unsigned int size = 0; //assumes the size is sent as an int
    Byte* recvBuffer;

    [iStream read:&size maxLength:sizeof(unsigned int)];

    recvBuffer = new Byte[size];
    memset(recvBuffer, 0, size);

    [iStream read:recvBuffer maxLength:size];

    NSData *webdata = [NSData dataWithBytes:recvBuffer length:size];
    imageview.image = [UIImage imageWithData:webdata];

    delete [] recvBuffer;

Редактировать Мой внутренний C ++ заставил меня использовать новые и удалять. Хотя вы можете использовать это в Obj-C, используя суффикс файла .mm, этот вопрос помечен как Objective-C. Вам следует использовать ответ JeremyP, так как он также включает проверку ошибок и более надежный способ чтения всего изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...