2013-01-25 20 views
0

我想從我的c#服務器接收jpeg圖像。奇怪的是,當我使用調試器運行它時,在方法中的任何地方都有一個斷點,它的工作狀態非常好。如果沒有斷點,然後我得到這個錯誤無法從服務器接收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; 
} 

}

+0

errr。您在流結束之前創建圖像。當然這將是腐敗的。使用調試器運行可能會引入延遲,這將導致has bytes調用提供一組完整的數據。您需要取消註銷流中的位,並在可用位註釋掉它。 – Bergasms

+0

我遇到的問題是nsstreameventencountered永遠不會被調用。 – user1585542

+0

我認爲如果你能夠事先知道圖像會持續多久會更好 - 所以你知道何時停止附加字節。當發生這種情況時,您可以構建您的圖像 – gerrytan

回答

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; 
+0

這使我獲得了我的形象,但最終在出現之前花了大約一分鐘。爲什麼需要這麼長時間? – user1585542

+0

@ user1585542圖像以數據字節形式存在,因此需要花費時間才能加載,或者您的圖像大小超過了5 MB或更多,則加載時間將會增加。 – skyline

+0

感謝您的幫助天際線。圖像只有37KB,所以我覺得奇怪的是,它需要一分鐘才能發送。它會立即發送我的第一個解決方案和一個調試停止。任何想法,我可以嘗試並加快速度? – user1585542

0

看來我們假定你是整個JPEG圖像將被轉移到一個塊中,您可以通過一次發生'HasBytesAvailable'事件來閱讀它。但是,您還應該考慮將JPEG圖像以多個塊傳輸給您的情況。

如果您設置了斷點,它可能對您有用,因爲您的代碼執行可能在某處停止,並且您的網絡緩衝區有足夠的時間來接收圖像的所有字節。但沒有斷點,它可能沒有時間這樣做。

嘗試重構代碼以累積字節塊,並且只假設在所有字節傳輸完畢後完成。 (通常你必須知道圖像預先多少字節將是 - 或者你可以捕捉流事件的結束)

+0

對不起,我是插座和網絡編程的新手。我會怎麼做呢? – user1585542

相關問題