【问题标题】:Sending files over Socket (iOS)通过 Socket 发送文件 (iOS)
【发布时间】:2012-09-19 17:40:09
【问题描述】:

我创建了一个基于 Socket 的简单聊天应用。 帖子:Socket Based iPhone App 帮助我创建了这个。

我现在想通过套接字发送/接收文件。 请指点我如何实现这一目标。

干杯, 不客气

编辑:

用于连接套接字的代码是:

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]]; 的事实,是否有可能由于连接带宽而无法发送整个文件。 如果没有发送整个文件,如何确保发送其余文件。

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

【问题讨论】:

  • 这个问题太模糊了。您需要更具体地说明您遇到问题的部分。你知道如何打开和读取文件吗?你知道如何扩展你的协议来支持发送文件吗?
  • 不。当涉及到套接字时,我真的不知道与文件处理有关的任何事情。我必须发送的文件保存在应用程序的文档目录中。
  • 我问了一个问题,但在任何地方都没有得到令人满意的解释。真的没有看到投反对票的必要性......如果你投了反对票,那么你必须对此有一个很好的答案,或者至少有一个指向解决方案的指针。否决票不是我关心的问题。有人请给我一个解决方案。
  • wtf....当他们投反对票时,您不能发表评论...我确实想知道原因....

标签: iphone ios file sockets ios5


【解决方案1】:

如果你的 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;
        }
    }

【讨论】:

    【解决方案2】:

    文件包含数据。网络连接(套接字或其他)传输数据。您可以打开文件,读取数据,然后开始将相同的数据写入您的套接字。不过……

    您可能希望在聊天会话的上下文中传输文件。因此,您将希望以某种方式分隔文件,以便连接的接收端意识到遇到的数据是一个文件。您可能希望传输文件的一些元数据,例如名称、大小等。

    究竟如何你做的这一切完全取决于你。您在连接的两端编写代码,因此如果您想出一个计划并正确实施它,您应该能够使其工作。一种方法是使用一些魔术字符串,如+++++++++++++ 来分隔文件信息的开头。如果您指定字节数,那么您可以将那么多字节写入连接并期望另一端读取那么多字节。另一种方法是将整个数据流转换为包含元信息。例如,您可以使用基于 XML 的格式。

    这完全取决于你。

    【讨论】:

    • 我确实用文件的数据和一些元数据创建了一个 JSON 格式。但由于某种原因,写作从未停止过。我假设要发送的整个数据没有在第一次写入时写入,它继续等待下一组数据。看来我必须想办法发送其余数据。
    猜你喜欢
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 2021-07-09
    • 2015-10-04
    • 2015-11-19
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    相关资源
    最近更新 更多