无法从服务器正确接收UIImage

时间:2014-01-18 13:53:52

标签: ios objective-c uiimage inputstream

我对Objective-c有点新意,所以请帮忙。我收到的图片但不完全是我的代码。 我确信问题出在这里,而不是在服务器端,但是如果你需要我发布服务器端的代码,那就不好了。

       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();

1 个答案:

答案 0 :(得分:0)

每次当流来到你创建一个新数据并尝试追加..但实际上你并没有将所有数据附加到你正在这样做的一个数据对象NSMutableData *dataa=[[NSMutableData alloc] initWithLength:0]

我更喜欢有一个实例变量并且喜欢这个

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

整个代码应该是这样的,代码来自apple 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不会将数据放在一个大块中,这就是我们在这里添加数据的原因。将使用事件调用Delegate方法,您可以设置事件检查。 当您收到此活动时NSStreamEventEndEncountered关闭stream个对象并创建uiimage object

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