2012-02-24 174 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; 
     } 
    }