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.
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
https://github.com/robbiehanson/CocoaAsyncSocket è il repo ufficiale di GitHub per CocoaAsyncSocket. – zadr
@zadr yes amico, ho usato lo stesso codice. ..... – HarshIT