gpt4 book ai didi

iphone - 如何在 iOS 中通过 wifi 传输大文件

转载 作者:技术小花猫 更新时间:2023-10-29 10:40:21 26 4
gpt4 key购买 nike

我下载了WiTap代码来自 Apple 的网站。它用于通过本地 wifi 网络传输数据。我在一个项目中工作,以作为客户端-服务器架构进行交互。我将 NSData 从客户端发送到服务器。

我做了 2 个项目;一个用于客户端,一个用于服务器

在客户端项目中,我做了以下更改为此,我通过添加以下方法修改了 AppController.m 文件

AppController.m(客户端)

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

然后通过调用这个方法我发送数据。

在服务器端项目中,我通过修改以下方法修改了 AppController.m 文件,做了以下修改

AppController.m(服务器端)

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

并添加了将接收到的数据写入文件的方法

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

我将 .png 文件转换为 NSData 并将它们从客户端发送到服务器端。服务器将文件下载到文档目录

问题是,当我从客户端传输文件时,它会下载到服务器端的文档目录中。在小文件的情况下一切正常。如果文件大小超过 8kB ,写入文档目录的文件会损坏。

请帮助我发送大文件。

最佳答案

问题是您的代码不会循环收集所有可用数据直到结束(或循环发送所有数据)。所以你只会收到第一个数据缓冲区。如果图像很小,则可以正常工作,如果图像较大,则永远不会。

您需要编写代码,以便在有缓冲区空间时继续发送,直到发送完所有数据,并继续读取数据(进入 NSMutableData 实例变量,而不是局部变量)直到结束到达流的。

关于iphone - 如何在 iOS 中通过 wifi 传输大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15829856/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com