2013-04-05 7 views
12

मैंने ऐप्पल की वेबसाइट से WiTap कोड डाउनलोड किया। यह स्थानीय वाईफाई नेटवर्क पर डेटा स्थानांतरित करने के लिए है। मैं क्लाइंट - सर्वर आर्किटेक्चर के रूप में बातचीत करने के लिए एक परियोजना में काम कर रहा हूं। मैं क्लाइंट साइड से सर्वर पर एनएसडीटा भेज रहा हूं।आईओएस में वाईफाई पर बड़ी फ़ाइलों को कैसे स्थानांतरित करें

मैंने 2 परियोजनाएं की हैं; ग्राहक के लिए और एक सर्वर

ग्राहक के पक्ष परियोजना पर के लिए, मैं मैं निम्नलिखित विधि जोड़कर AppController.m फ़ाइल को संशोधित परिवर्तन निम्नलिखित है कि के लिए बनाया

AppController.m (क्लाइंट साइड)

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

फिर इस विधि को कॉल करके मैं डेटा भेजता हूं।

सर्वर साइड परियोजना में, मैं निम्नलिखित है कि के लिए chagnes मैं निम्नलिखित विधि

AppController.m (सर्वर साइड)

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

संशोधित करके AppController.m फ़ाइल को संशोधित कर दिया और एक विधि जोड़ा प्राप्त डेटा को

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

मैं .png फ़ाइलों को NSData में परिवर्तित करता हूं और उन्हें क्ल से भेजता हूं सर्वर पक्ष के लिए ient पक्ष। सर्वर दस्तावेज़ निर्देशिका

मामले को डाउनलोड करता है, जब मैं क्लाइंट पक्ष से फ़ाइल स्थानांतरित करता हूं, तो यह दस्तावेज़ निर्देशिका में सर्वर पक्ष में डाउनलोड हो जाता है। छोटी फाइलों के मामले में सब कुछ ठीक काम करता है। यदि फ़ाइल का आकार 8kb से अधिक हो गया है, तो दस्तावेज़ निर्देशिका में लिखी गई फ़ाइल दूषित हो जाती है।

कृपया मुझे बड़ी फाइलें भेजने में सक्षम होने में मदद करें।

उत्तर

0

आप AsyncSocket जो

https://github.com/roustem/AsyncSocket से डाउनलोड किया जा सकता है,

इस एक उद्देश्य-सी आवरण CFSocket और CFNetwork पर निर्माण है का उपयोग कर सकते हैं, यह टीसीपी/यूडीपी पर प्रोटोकॉल के साथ आंकड़ा अंतरण की बड़ी राशि संभाल कर सकते हैं स्थानीय वाईफाई

आप विकि यहाँ https://github.com/darkseed/cocoaasyncsocket/wiki/iPhone

वर्ग पा सकते हैं यह एक कोशिश

+0

मैंने इसे पहले कोशिश की लेकिन उस मामले में मुझे भी एक ही समस्या का सामना करना पड़ा। मैं यूडीपी पर स्थानांतरित करता था, वहां भी मैं 9 केबी से बड़ी फाइल नहीं भेज सका .. – HarshIT

+0

https://github.com/robbiehanson/CocoaAsyncSocket CocoaAsyncSocket के लिए आधिकारिक गिटहब रेपो है। – zadr

+0

@zadr हाँ दोस्त, मैंने एक ही कोड का उपयोग किया। ..... – HarshIT

1

समस्या यह है कि अपने कोड पाश उपलब्ध डेटा के सभी इकट्ठा करने के लिए नहीं करता है implement.Give करने के लिए बहुत सरल और आसान है अंत तक (या लूप सभी डेटा भेजने के लिए)। तो आप केवल डेटा के पहले बफर प्राप्त करते हैं। अगर छवि छोटी है तो यह ठीक काम करता है, अगर छवि बड़ी है तो यह कभी नहीं होगी।

आपको कोड लिखने की आवश्यकता है ताकि जब तक सभी डेटा भेजा नहीं जाता है तब तक बफर स्पेस भेजता रहता है और डेटा को पढ़ने के बाद तक (NSMutableData इंस्टेंस वैरिएबल, स्थानीय चर नहीं) तक पहुंचता रहता है।

-1

आपने एक वेब सेवा बनाई है जहां से आपको सिस्टम का आईपी पता डालना होगा, जहां आप फ़ाइल भेजना चाहते हैं और उसके बाद जब आप दर्ज आईपी पते से कनेक्ट हो सकते हैं तो आप फ़ाइल को बेस 64 और एनएसडीटा में भेज सकते हैं प्रारूप।

+0

वाईटैप कोड देखें, यह बोनजोर सेवा का उपयोग करता है। – HarshIT

+0

मुझे उस webservice को कहां रखना होगा: डी, ​​कृपया पूरा प्रश्न पढ़ें। – HarshIT

संबंधित मुद्दे