我正在使用蘋果公司SimpleFTPSample示例代碼的編輯版本,特別是「PUT」部分。其中有這種方法:NSConnection關閉時不從FTP斷開連接
- (void)stopSendWithStatus:(NSString *)statusString
{
if (self.networkStream != nil) {
[self.networkStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
self.networkStream.delegate = nil;
[self.networkStream close];
self.networkStream = nil;
}
if (self.fileStream != nil) {
[self.fileStream close];
self.fileStream = nil;
}
[self sendDidStopWithStatus:statusString];
uploaderbusy = 0;
}
問題是上傳後應用程序不關閉連接。上面的代碼被執行。這兩個IF語句都是正確的,並且內部的代碼被執行。
此代碼:
NSLog(@"%lu",[self.networkStream streamStatus]);
[self.networkStream close];
NSLog(@"%lu",[self.networkStream streamStatus]);
給出了這樣的輸出:
2013-03-03 17:50:26.460 Stockuploader[575:303] 2
2013-03-03 17:50:26.498 Stockuploader[575:303] 6
但連接保持打開狀態,並最終超時。這是FTP服務器的日誌:
(000006)03/03/2013 17.50.27 - root2 (192.168.0.3)> 150 Connection accepted
(000006)03/03/2013 17.50.27 - root2 (192.168.0.3)> 226 Transfer OK
(000006)03/03/2013 17.52.28 - root2 (192.168.0.3)> 421 Connection timed out.
(000006)03/03/2013 17.52.28 - root2 (192.168.0.3)> disconnected.
這是爲什麼?
如果我關閉程序,那麼連接立即在FTP上關閉。難道是我不得不釋放self.filestream?如果是這樣,我怎麼能用ARC啓用它?
---- ---- UPDATE
我發現,在我關閉連接我要送「退出」到FTP服務器,以讓他知道,我想斷開連接。但我怎樣才能實現發送「QUIT」命令到SimpleFTPSample
?
'[self.networkStream關閉]'應關閉連接。你使用哪個ftp服務器? – 2013-03-03 17:51:35
我在網絡中的另一臺電腦上使用filezilla。如果我關閉連接,然後重新打開一個新文件的流,那麼它不會再次發送用戶名和密碼。它會剛剛開始上傳文件。如果連接已關閉,則應重新記錄... streamstatus正在返回6,這意味着它已關閉。但是,只要我關閉程序或超時,FTP就會斷開連接。也許我不得不dealloc流,但與ARC啓用我得到一個錯誤。 – sharkyenergy 2013-03-03 17:54:57
我不確定您是否可以重新使用相同的'self.networkStream'作爲新連接,我假設您必須創建一個新連接。但這並不能解釋關閉超時。 - (我不能測試這個,因爲我有一臺Mac和Filezilla Server似乎只有Windows。) – 2013-03-03 18:06:16