2013-04-05 14 views
12

ich heruntergeladen WiTap-Code von der Apple-Website übertragen. Es ist für die Übertragung von Daten über lokale WLAN-Netzwerk. Ich arbeite in einem Projekt, um als Client - Server - Architektur zu interagieren. Ich sende NSData von Clientseite an Server.Wie große Dateien über Wi-Fi in iOS

Ich habe 2 Projekte; ein für die Kunden und ein für Server

Auf Client-Seite Projekt habe ich Änderungen folgende Für, dass ich die AppController.m Datei

durch Zugabe folgende Methode modifizierte

AppController.m (Client-Seite)

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

Dann durch den Aufruf dieser Methode Daten senden.

Am Server Nebenprojekt habe ich chagnes für die folgenden ich die Datei AppController.m

AppController.m (Serverseite) durch Modifizieren folgende Verfahren ein Verfahren modifiziert

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

hinzugefügt und um die empfangenen Daten als Datei zu schreiben

Ich konvertiere .png Dateien zu NSData und sende sie von cl auf der Serverseite. der Server lädt die Datei in Dokumentenverzeichnis

Die Sache ist, wenn ich Datei von Client-Seite übertragen, um es zu Server-Seite bei Dokumentenverzeichnis heruntergeladen wird. Bei kleinen Dateien funktioniert alles. Wenn die Dateigröße 8 KB überschreitet, wird die im Dokumentenverzeichnis geschriebene Datei beschädigt.

Bitte helfen Sie mir der Lage sein, große Dateien zu senden.

Antwort

0

können Sie AsyncSocket verwenden, die von

heruntergeladen werden kann

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

dies ein Objective-C-Wrapper auf CFSocket und CFNetwork baut, kann es große Menge an Datenübertragung mit TCP/UDP-Protokoll verarbeitet auf lokale Wi-Fi.

Sie das Wiki hier https://github.com/darkseed/cocoaasyncsocket/wiki/iPhone

Die Klasse ist sehr einfach und leicht zu implement.Give ein es versuchen

+0

Ich habe es zuerst versucht, aber in diesem Fall auch ich sah das gleiche Problem. Ich habe über UDP übertragen, dort konnte ich auch keine Dateien größer als 9 kB .. – HarshIT

+0

https://github.com/robiehanson/CocoaAsyncSocket ist das offizielle GitHub Repo für CocoaAsyncSocket. – zadr

+0

@zadr ja Alter, ich habe den gleichen Code verwendet. ..... – HarshIT

1

Das Problem ist, dass der Code nicht Schleife alle verfügbaren Daten finden sammeln bis zum Ende (oder Schleife, um alle Daten zu senden). Sie erhalten also immer nur den ersten Datenpuffer. Wenn das Bild klein ist, funktioniert das ok, wenn das Bild größer ist, wird es das nie.

Sie müssen den Code schreiben, so dass es das Senden hält, wenn Pufferraum gibt es, bis alle Daten gesendet und Lesen von Daten halten (in eine NSMutableData Instanz-Variable, nicht eine lokale Variable), bis das Ende des Stroms erreicht ist.

-1

Sie haben einen Webdienst erstellt, von dem Sie die IP-Adresse des Systems eingeben müssen, wo Sie die Datei senden möchten und danach können Sie die Datei in Base64 und NSData senden, wenn Sie mit der eingegebenen IP-Adresse verbunden sind Format.

+0

siehe WiTap-Code, es verwendet Bonjour-Dienst. – HarshIT

+0

Wo würde ich diesen Webservice installieren müssen: D, bitte lesen Sie die ganze Frage. – HarshIT

Verwandte Themen