通过Socket(iOS)发送文件

时间:2012-02-24 14:26:22

标签: iphone ios file sockets ios5

我创建了一个基于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]];这一事实可能会因连接带宽而无法发送整个文件。 如果未发送整个文件,则如何确保发送其余文件。

这是通过套接字发送文件的正确方法吗? 请建议..

2 个答案:

答案 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的格式。

这完全取决于你。