2011-01-06 4 views
4

iPhoneで画像受信機を作っています。iPhoneプログラミングでは、XP OSを搭載したサーバーからTCP/IPで画像ファイルを受け取るにはどうすればよいですか?

サーバーは、画像ファイルをバイトで送信します。

このバイトを画像化しようとしました。

しかし、私はイメージを作ることができません。すでに、過去数日間...

私は本当にあなたの助けが必要...

これは私が使用したソースコードです。

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

あなたがコメントをすれば、私は本当にappriciate!読んでくれてありがとう!

+0

私の最初の印象は、画像全体に割り当てられた499バイトが少し小さいことです。さらに、データの受信の検証とエラー処理を完全に無視するように見えます。 –

+0

@Claus Broch:500バイト。終端ヌルバイトは必要ありません。 – JeremyP

+0

@JeremyP:終了する必要はないが、提示されたコードは実際には500バイトが割り当てられていても499バイトしか転送できないことに同意する。 –

答えて

2

TCP/IPはOSに依存しないプロトコルなので、サーバー上でXPを使用しているという事実は、Windows APIをソケット操作に使用する可能性を除いて、何にも影響しません。

Claus Brochは、画像に対して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の答えは、エラーチェックと完全な画像を読むためのより信頼できる方法が含まれているため、答えを使用する必要があります。

+0

質問はObjective-CではなくC++とタグ付けされています。 newとdeleteはObjective-Cにありません。 – JeremyP

+0

おっと、あなたは私の主に使用されている言語が何であるかを知ることができます! ;)私は答えを更新するでしょう。それを指摘してくれてありがとう。 – badgerr

3

badgerrの答えは実質的に私が使用するものですが、質問には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]; 

私は上記のように入力したので、テストされていないか、コンパイルされていません。

関連する問題