2012-02-24 175 views
1

我创建了一个基于Socket的Simple Chat应用程序。 帖子:Socket Based iPhone App帮我创建了这个。通过Socket发送文件(iOS)

我现在想通过套接字发送/接收文件。 请给我指点,我可以如何去实现这一点。

干杯, 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是th必须发送的字符串。

现在,当我尝试通过套接字发送文件时,考虑到我将文件转换为NSData并使用[self.outputStream write:[aData bytes] maxLength:[aData length]];的事实,可能会由于连接带宽而导致整个文件未发送。 如果整个文件没有发送,如何确保发送剩下的文件。

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

+0

这个问题太含糊。您需要更具体地了解您遇到问题的部分。你知道如何打开和读取文件吗?你知道如何扩展你的协议来支持发送文件吗? – 2012-03-01 08:11:25

+0

不是。当涉及套接字时,我真的不知道与文件处理有关的任何事情。我必须发送的文件保存在应用程序的文档目录中。 – Roshit 2012-03-01 11:12:07

+0

我问了一个问题,我没有得到任何满意的解释。真的没有看到投票的必要性...如果你投下了票,你必须对此有一个很好的回答,或者至少指向解决方案。投票不是我关心的。有人请给我一个解决方案。 – Roshit 2012-03-01 11:15:28

回答

1

文件包含数据。网络连接(套接字或其他)传输数据。你只需打开文件,读取数据,然后开始将相同的数据写入套接字。然而...

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

确切地说如何您是否完全取决于您。你在连接的两端编写代码,所以如果你想出一个计划并正确实施,你应该能够使它工作。一种方法会使用一些魔术字符串,例如+++++++++++++来限定文件信息的开始。如果指定了字节数,则可以将很多字节写入连接,并期望另一端读取多少字节。另一种方法是将您的整个数据流转换为包含元信息。例如,您可以使用基于XML的格式。

这真的取决于你。

+0

我确实使用文件和一些元数据的数据创建了JSON格式。但由于某种原因,写作从未停止过。我假设要发送的整个数据在第一次写入时没有写入,并且它继续等待下一组数据。好像我必须找出发送其余数据的方法。 – Roshit 2012-03-19 12:31:17

2

如果你的NSData足够大,你需要把它切成pieces.You'll需要字节将他们转移。例如:

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