So übertragen Sie große Dateien über WLAN in iOS

Ich habe heruntergeladenWiTap Code Von der Apple-Website. Dient zum Übertragen von Daten über ein lokales WLAN-Netzwerk. Ich arbeite in einem Projekt, um als Client - Server - Architektur zu interagieren. Ich sende NSData vom Client zum Server.

Ich habe 2 Projekte gemacht; eine für Client und eine für Server

Am clientseitigen Projekt habe ich folgende Änderungen vorgenommenAppController.m Datei durch Hinzufügen der folgenden Methode

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, indem ich diese Methode aufrufe, sende ich Daten.

Beim serverseitigen Projekt habe ich folgende Änderungen vorgenommen: Ich habe die Datei AppController.m durch Ändern der folgenden Methode geändert

AppController.m (Serverseite)

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

und fügte eine Methode hinzu, um die empfangenen Daten als Datei zu schreiben

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

Ich konvertiere PNG-Dateien nach NSData und sende sie von Client zu Server. Der Server lädt die Datei in das Dokumentverzeichnis herunter

Die Sache ist, wenn ich Datei von der Klientenseite übertrage, wird sie zur Bedienerseite am Dokumentenverzeichnis gedownloadet. Bei winzigen Dateien funktioniert alles einwandfrei. Wenn die Dateigröße 8 KB überschreitet, wird die im Dokumentverzeichnis geschriebene Datei beschädigt.

Bitte helfen Sie mir, große Dateien versenden zu können.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage