Tôi đã tải xuống WiTap Mã từ trang web của Apple. Nó để chuyển dữ liệu qua mạng wifi cục bộ. Tôi đang làm việc trong một dự án để tương tác với kiến trúc máy khách - máy chủ. Tôi đang gửi NSData từ phía máy khách đến máy chủ.Cách chuyển các tệp lớn qua wifi trong iOS
Tôi đã tạo 2 dự án; một cho khách hàng và một cho máy chủ
Tại dự án phía khách hàng, tôi đã làm sau Changes Cho rằng tôi sửa đổi AppController.m tập tin bằng cách thêm phương pháp sau đây
AppController.m (Client side)
- (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);
}
}
Sau đó, bằng cách gọi phương thức này, tôi gửi dữ liệu.
Tại dự án phía Server, tôi đã thực hiện thay đổi cho rằng sau tôi sửa đổi các tập tin AppController.m bằng cách thay đổi phương pháp sau đây
AppController.m (Server side)
- (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;
}
}
và thêm một phương pháp để ghi dữ liệu đã nhận dưới dạng tệp
#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;
}
Tôi chuyển đổi tệp .png thành NSData và gửi chúng từ cl ient bên để phía máy chủ. máy chủ tải tệp xuống Document Directory
Vấn đề là khi tôi chuyển tệp từ phía máy khách, tệp sẽ được tải xuống phía máy chủ tại thư mục tài liệu. Mọi thứ hoạt động tốt trong trường hợp các tệp nhỏ. Nếu kích thước tệp vượt quá 8kB, tệp được ghi tại thư mục tài liệu bị hỏng.
Vui lòng giúp tôi để có thể gửi các tệp lớn.
Tôi đã thử nó trước nhưng trong trường hợp đó tôi cũng phải đối mặt với cùng một vấn đề. tôi được sử dụng để chuyển qua UDP, cũng có tôi không thể gửi các tập tin lớn hơn 9 kB .. – HarshIT
https://github.com/robbiehanson/CocoaAsyncSocket là repo GitHub chính thức cho CocoaAsyncSocket. – zadr
@zadr có dude, tôi đã sử dụng cùng một mã. ..... – HarshIT