【问题标题】:UIImage not received correctly from serverUIImage 未从服务器正确接收
【发布时间】:2014-01-19 01:37:12
【问题描述】:

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

【问题讨论】:

  • 如果你从服务器端获取图片的url并得到这样的图片,那将非常容易......UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:MyURL]]];
  • 服务器是java服务器,我使用sockets发送和接收
  • 这可以与任何服务器一起使用...但是由于套接字是您的要求,您做得对...在这种情况下可能是一些数据包尚未收到...
  • 如果图像大小大于您分配的缓冲区,那么您将丢失一些东西>

标签: ios objective-c uiimage inputstream


【解决方案1】:

每次流来时,您都会创建一个新数据并尝试追加.. 但实际上您并没有将所有数据追加到一个数据对象,您正在这样做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 对象并创建 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];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    相关资源
    最近更新 更多