我创建了一个基于Socket的简单聊天应用。 帖子:Socket Based iPhone App帮助我创造了这个。
我现在想通过套接字发送/接收文件。 请指点我如何实现这一目标。
干杯, Roshit
修改
用于连接套接字的代码是:
NSString *aHostName = @"xx.xx.xx.xx";
NSInteger aPort = 1234;
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)aHostName, aPort, &readStream, &writeStream);
self.inputStream = (NSInputStream *)readStream;
self.outputStream = (NSOutputStream *)writeStream;
[self.inputStream setDelegate:self];
[self.outputStream setDelegate:self];
[self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.inputStream open];
[self.outputStream open];
用于发送数据的代码是
NSData *aData = [[NSData alloc] initWithData:[iRequestAPI dataUsingEncoding:NSASCIIStringEncoding]];
[self.outputStream write:[aData bytes] maxLength:[aData length]];
[aData release];
其中,iRequestAPI是必须发送的字符串。
现在,当我尝试通过套接字发送文件时,考虑到我将文件转换为NSData并使用[self.outputStream write:[aData bytes] maxLength:[aData length]];
这一事实可能会因连接带宽而无法发送整个文件。
如果未发送整个文件,则如何确保发送其余文件。
这是通过套接字发送文件的正确方法吗? 请建议..
答案 0 :(得分:2)
如果您的NSData足够大,则需要将其剪切成碎片。您需要使用字节来传输它们。例如:
NSData *newData = UIImagePNGRepresentation([UIImage imageNamed:@"Default.png"]);
int index = 0;
int totalLen = [newData length];
uint8_t buffer[1024];
uint8_t *readBytes = (uint8_t *)[newData bytes];
while (index < totalLen) {
if ([outputStream hasSpaceAvailable]) {
int indexLen = (1024>(totalLen-index))?(totalLen-index):1024;
(void)memcpy(buffer, readBytes, indexLen);
int written = [outputStream write:buffer maxLength:indexLen];
if (written < 0) {
break;
}
index += written;
readBytes += written;
}
}
答案 1 :(得分:1)
文件包含数据。网络连接(套接字或其他)传输数据。您可以只打开文件,读取数据,然后开始将相同的数据写入套接字。然而...
您可能希望在聊天会话的上下文中传输文件。因此,您将要以某种方式划分文件,以便连接的接收端意识到传入的数据是文件。而且您可能希望传输文件的一些元数据,例如名称,大小等。
完全如何你做的一切完全取决于你。您在连接的两端编写代码,因此如果您想出一个计划并正确实现它,您应该能够使它工作。一种方法是使用一些魔术字符串,如+++++++++++++
来分隔文件信息的开头。如果指定了字节数,那么可以将多个字节写入连接,并期望另一方读取那么多字节。另一种方法是将整个数据流转换为包含元信息。例如,您可以使用基于XML的格式。
这完全取决于你。