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.