2013-04-05 18 views
12

Ho scaricato il codice WiTap dal sito Web di Apple. È per il trasferimento di dati sulla rete Wi-Fi locale. Sto lavorando a un progetto per interagire come architettura client-server. Sto inviando NSData dal lato client al server.Come trasferire file di grandi dimensioni tramite Wi-Fi in iOS

Ho realizzato 2 progetti; uno per il client e uno per il server

Al progetto lato client, ho fatto seguenti modifiche Per questo ho modificato il file AppController.m aggiungendo seguente metodo

AppController.m (lato client)

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

Quindi chiamando questo metodo invio dati.

Al progetto lato server, ho fatto seguendo chagnes per questo ho modificato il file AppController.m modificando seguente metodo di

AppController.m (lato Server)

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

e aggiunto un metodo di scrivere i dati ricevuti come file

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

converto .png file NSData e inviarli da cl lato opposto al lato server. il server scarica il file in Document Directory

Il problema è che, quando trasferisco il file dal lato client, viene scaricato sul lato server nella directory dei documenti. Tutto funziona bene in caso di file piccoli. Se la dimensione del file supera 8kB, il file scritto nella directory del documento viene danneggiato.

Gentilmente aiutarmi a inviare file di grandi dimensioni.

risposta

0

È possibile utilizzare AsyncSocket che può essere scaricato da

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

si tratta di un obiettivo a c involucro costruire su CFSocket e CFNetwork, è in grado di gestire grandi quantità di trasferimento di dati con protocollo TCP/UDP su wifi locale.

È possibile trovare il wiki qui https://github.com/darkseed/cocoaasyncsocket/wiki/iPhone

La classe è molto semplice e facile da implement.Give un tentativo

+0

L'ho provato prima, ma in quel caso ho anche affrontato lo stesso problema. ero solito trasferire su UDP, ma non potevo inviare file più grandi di 9 kB .. – HarshIT

+0

https://github.com/robbiehanson/CocoaAsyncSocket è il repo ufficiale di GitHub per CocoaAsyncSocket. – zadr

+0

@zadr yes amico, ho usato lo stesso codice. ..... – HarshIT

1

Il problema è che il codice non fa ciclo di raccogliere tutti i dati disponibili fino alla fine (o loop per inviare tutti i dati). Quindi ricevi sempre il primo buffer di dati. Se l'immagine è piccola, allora funziona bene, se l'immagine è più grande allora non lo sarà mai.

È necessario scrivere il codice in modo che continui a inviare quando c'è spazio nel buffer finché tutti i dati non vengono inviati e continuano a leggere i dati (in una variabile di istanza NSMutableData, non una variabile locale) fino al raggiungimento della fine del flusso.

-1

Si è creato un servizio Web da cui è necessario inserire l'indirizzo IP del sistema, dove si desidera inviare il file e successivamente quando è possibile connettersi con l'indirizzo IP immesso è possibile inviare il file in Base64 e NSData formato.

+0

vedere il codice WiTap, utilizza il servizio Bonjour. – HarshIT

+0

dove avrei bisogno di mettere quel webservice: D, per favore leggi l'intera domanda. – HarshIT