2014-01-18 59 views
0

我是一種新的Objective-C,所以請幫助。我收到的圖像,但不完全是這裏是我的代碼。 我相信問題出在這裏,而不是在服務器端,但如果你需要我發佈服務器端的代碼,那麼生病了。UIImage沒有正確接收來自服務器

 uint8_t buf[3000000]; 
     int len = 0; 
     len = [inputStream read:buf maxLength:3000000]; 
     UIImage* fooo ; 
     NSMutableData *dataa=[[NSMutableData alloc] initWithLength:0]; 
     do{ 
     len = [inputStream read:buf maxLength:3000000]; 
      if(len>0) current+=len; 
     } 
     while (len>-1); 
     [dataa appendBytes: (const void *)buf length:current]; 
     fooo = [[UIImage alloc] initWithData:dataa]; 
    [inputStream close]; 
    [outputStream close]; 

服務器端

String FilePath=xxxxx.jpeg"; 
System.out.println (FilePath); 
    File file1=new  
    File(xxxxxx\\38.jpeg"); 
    long v=file1.length(); 
    byte [] mybytearray = new byte [(int)file1.length()]; 
FileInputStream fis = new  
    FileInputStream(FilePath); 
    BufferedInputStream bis = new  
    BufferedInputStream(fis); 
    bis.read(mybytearray,0,mybytearray.length); 
    os = connectionSocket.getOutputStream();//outpustream 
    System.out.println("Sending..."); 
    os.write(mybytearray,0,mybytearray.length); 
    System.out.println("Sent"); 
    os.flush(); 
+0

如果你從服務器端的URL的圖像和獲取圖像這樣它會很容易...'的UIImage *圖像= [ UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:MyURL]]];' –

+0

服務器是一個Java服務器,我使用套接字發送和接收 – user3188822

+0

這可以與任何服務器一起工作......但是,由於套接字是您的要求,您做對了...在這種情況下可能是一些數據包還沒有收到... –

回答

0

時流降臨時,你創建新的數據,並嘗試追加..但其實你沒有追加的所有數據到一個數據對象你正在做這樣NSMutableData *dataa=[[NSMutableData alloc] initWithLength:0]每次

我更喜歡有一個實例變量,做這樣的

if(!_data) { 
    _data = [[NSMutableData alloc] initWithLength:0]; 
} 

整個代碼應該是這樣的,代碼是從蘋果documentation

switch(eventCode) { 
     case NSStreamEventHasBytesAvailable: 
     { 
      if(!_data) { 
       _data = [[NSMutableData data] retain]; 
      } 
      uint8_t buf[1024]; 
      unsigned int len = 0; 
      len = [(NSInputStream *)stream read:buf maxLength:1024]; 
      if(len) { 
       [_data appendBytes:(const void *)buf length:len]; 
       // bytesRead is an instance variable of type NSNumber . 
       [bytesRead setIntValue:[bytesRead intValue]+len]; 
      } else { 
       NSLog(@"no buffer!"); 
      } 
      break; 
     } 

您應該處理流事件。 Stream不會將數據放在一個大塊中,所以我們在這裏添加數據。委託方法將與一個事件一起被調用,並且您可以設置檢查事件。 當你有這個事件NSStreamEventEndEncountered關閉stream對象,並創建uiimageobject

switch(NSStreamEventEndEncountered){ 
    [stream close]; 
    [stream removeFromRunLoop:[NSRunLoop currentRunLoop] 
       forMode:NSDefaultRunLoopMode]; 
    [stream release]; 
    stream = nil; // stream is ivar, so reinit it 

    if (_data!=nil) 
     UIImage *image = [UIImage imageWithData:_data]; 
} 
+0

我會嘗試現在 – user3188822

+0

是的這是正確的方式...我希望這會對你有用 –

相關問題