2013-04-05 26 views
12

Tôi đã tải xuống WiTap Mã từ trang web của Apple. Nó để chuyển dữ liệu qua mạng wifi cục bộ. Tôi đang làm việc trong một dự án để tương tác với kiến ​​trúc máy khách - máy chủ. Tôi đang gửi NSData từ phía máy khách đến máy chủ.Cách chuyển các tệp lớn qua wifi trong iOS

Tôi đã tạo 2 dự án; một cho khách hàng và một cho máy chủ

Tại dự án phía khách hàng, tôi đã làm sau Changes Cho rằng tôi sửa đổi AppController.m tập tin bằng cách thêm phương pháp sau đây

AppController.m (Client side)

- (void)sendData:(NSData*)pobjData 
{ 
    assert(self.streamOpenCount == 2); 

    if ([self.outputStream hasSpaceAvailable]) 
    { 
     NSInteger bytesWritten; 

     NSUInteger length = [pobjData length]; 

     bytesWritten = [self.outputStream write:[pobjData bytes] maxLength:[pobjData length]]; 

     NSLog(@"written bytes -> %d",bytesWritten); 
    } 
} 

Sau đó, bằng cách gọi phương thức này, tôi gửi dữ liệu.

Tại dự án phía Server, tôi đã thực hiện thay đổi cho rằng sau tôi sửa đổi các tập tin AppController.m bằng cách thay đổi phương pháp sau đây

AppController.m (Server side)

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode 
{ 
    #pragma unused(stream) 

    switch(eventCode) { 

     case NSStreamEventOpenCompleted: { 
      self.streamOpenCount += 1; 
      assert(self.streamOpenCount <= 2); 

      // Once both streams are open we hide the picker and the game is on. 

      if (self.streamOpenCount == 2) { 
       [self dismissPicker]; 

       [self.server deregister]; 
      } 
     } break; 

     case NSStreamEventHasSpaceAvailable: { 
      assert(stream == self.outputStream); 
      // do nothing 
     } break; 

     case NSStreamEventHasBytesAvailable: 
     { 
      if (stream == self.inputStream) 
      { 

       NSInteger bytesRead; 
       uint32_t buffer[32768]; 

       NSMutableData *_data = [NSMutableData data]; 

       // Pull some data off the network. 
       bytesRead = [self.inputStream read:buffer maxLength:sizeof(buffer)]; 
       if (bytesRead == -1) { 

       } else if (bytesRead == 0) { 

       } else { 
        // FIXME: Popup an alert 

        const long long expectedContentLength = bytesRead; 
        NSUInteger expectedSize = 0; 

        // expectedContentLength can be represented as NSUInteger, so cast it: 
        expectedSize = (NSUInteger)expectedContentLength; 

        [_data appendBytes:buffer length:expectedSize]; 

        NSLog(@"\"Data received has length: %d", _data.length); 

        [self performSelector:@selector(getData:) withObject:_data afterDelay:1.0]; 
       } 
      } 
     } 
      break; 

     default: 
      assert(NO); 
      // fall through 
     case NSStreamEventErrorOccurred: 
      // fall through 
     case NSStreamEventEndEncountered: { 
      [self setupForNewGame]; 
     } break; 
    } 
} 

và thêm một phương pháp để ghi dữ liệu đã nhận dưới dạng tệp

 #define kUserDirectoryPath NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) 

-(void)getData:(NSMutableData *)pData 
{ 
       NSFileManager *tmpmanager = [NSFileManager defaultManager]; 
       [tmpmanager createFileAtPath:[AppController getDocumentDirectoryPath:[NSString stringWithFormat:@"%@.png",[NSDate date]]] contents:pData attributes:nil]; 
} 


+(NSString*)getDocumentDirectoryPath:(NSString*)pStrPathName 
{ 
      NSString *strPath=nil; 

      if(pStrPathName) 
       strPath = [[kUserDirectoryPath objectAtIndex:0] stringByAppendingPathComponent:pStrPathName]; 

      return strPath; 
} 

Tôi chuyển đổi tệp .png thành NSData và gửi chúng từ cl ient bên để phía máy chủ. máy chủ tải tệp xuống Document Directory

Vấn đề là khi tôi chuyển tệp từ phía máy khách, tệp sẽ được tải xuống phía máy chủ tại thư mục tài liệu. Mọi thứ hoạt động tốt trong trường hợp các tệp nhỏ. Nếu kích thước tệp vượt quá 8kB, tệp được ghi tại thư mục tài liệu bị hỏng.

Vui lòng giúp tôi để có thể gửi các tệp lớn.

Trả lời

0

Bạn có thể sử dụng AsyncSocket mà có thể được tải về từ

https://github.com/roustem/AsyncSocket,

đây là một wrapper Objective-C xây dựng trên CFSocket và CFNetwork, nó có thể xử lý số lượng lớn truyền dữ liệu với giao thức TCP/UDP trên wifi cục bộ.

Bạn có thể tìm wiki đây https://github.com/darkseed/cocoaasyncsocket/wiki/iPhone

Lớp là rất đơn giản và dễ dàng để implement.Give nó một thử

+0

Tôi đã thử nó trước nhưng trong trường hợp đó tôi cũng phải đối mặt với cùng một vấn đề. tôi được sử dụng để chuyển qua UDP, cũng có tôi không thể gửi các tập tin lớn hơn 9 kB .. – HarshIT

+0

https://github.com/robbiehanson/CocoaAsyncSocket là repo GitHub chính thức cho CocoaAsyncSocket. – zadr

+0

@zadr có dude, tôi đã sử dụng cùng một mã. ..... – HarshIT

1

Vấn đề là mã của bạn không vòng lặp để thu thập tất cả các dữ liệu có sẵn cho đến cuối (hoặc vòng lặp để gửi tất cả dữ liệu). Vì vậy, bạn chỉ nhận được bộ đệm dữ liệu đầu tiên. Nếu hình ảnh nhỏ thì hoạt động ok, nếu hình ảnh lớn hơn thì sẽ không bao giờ.

Bạn cần phải viết mã để nó tiếp tục gửi khi có dung lượng bộ đệm cho đến khi tất cả dữ liệu được gửi và tiếp tục đọc dữ liệu (thành biến số NSMutableData, chứ không phải biến cục bộ) cho đến khi kết thúc luồng.

-1

Bạn đã thực hiện dịch vụ web từ nơi bạn cần đặt địa chỉ IP của hệ thống, nơi bạn muốn gửi tệp và sau đó khi bạn có thể kết nối với địa chỉ IP đã nhập, bạn có thể gửi tệp trong Base64 và NSData định dạng.

+0

xem mã WiTap, nó sử dụng dịch vụ Bonjour. – HarshIT

+0

nơi tôi cần phải đặt dịch vụ web đó: D, vui lòng đọc toàn bộ câu hỏi. – HarshIT

Các vấn đề liên quan