Cómo transferir archivos grandes a través de wifi en iOS

yo descarguéWiTap Código del sitio web de Apple. Es para la transferencia de datos a través de la red wifi local. Estoy trabajando en un proyecto para interactuar como arquitectura cliente-servidor. Estoy enviando NSData del lado del cliente al servidor.

Hice 2 proyectos; uno para cliente y otro para servidor

En el proyecto del lado del cliente, hice los siguientes cambios Para eso modifiqué elAppController.m archivo agregando el siguiente método

AppController.m (Lado del cliente)

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

Entonces llamando a este método envio datos.

En el proyecto del lado del servidor, hice los siguientes cambios para que modifiqué el archivo AppController.m modificando el siguiente método

AppController.m (Lado del servidor)

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

y agregó un método para escribir los datos recibidos como un archivo

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

Convierto archivos .png a NSData y los envío del lado del cliente al lado del servidor. El servidor descarga el archivo a Document Directory.

El asunto es que, cuando transfiero un archivo desde el lado del cliente, se descarga al lado del servidor en el directorio de documentos. Todo funciona bien en caso de pequeños archivos. Si el tamaño del archivo supera los 8 KB, el archivo escrito en el directorio del documento se corrompe.

Por favor ayúdame a poder enviar archivos de gran tamaño.

Respuestas a la pregunta(3)

Su respuesta a la pregunta