公司的一個項目功能,需要通過ftp實現一系列功能,主要功能有三個,
1,獲取服務器上的某個路徑下的內容;
2,將本地的圖片上傳至服務器;
3,將服務器上的文件下載到本地。
最開始做的時候,定的方向是,網上找ftp的sdk,或者demo,然後集成到項目中來,在Github上找了很多也下下來,試了,最後決定用的是LxFTPRequest
使用起來也比較簡單,只需要將對應的參數傳入,然後block回調那裡做相應的處理即可,但是,做到後面快完工的時候,測試發現,內網所有操作都ok,一切到外網,直接報錯,錯誤信息,還是unknow,然後就去換了其他的demo,還試了蘋果官方的ftp demo,https://developer.apple.com/library/content/samplecode/SimpleFTPSample/Introduction/Intro.html,錯誤信息都一樣,沒辦法解決,後面通過Wireshark抓包分析,得到一個錯誤信息,500,oops啥的,最後還是沒辦法解決,可是安卓那邊是ok的。
後面得知,我這邊的訪問方式和安卓那邊不一樣,我這邊是通過,將IP/域名,加端口號,加上目標路徑,拼接成一個url鏈接,然後進行訪問,請求,而安卓,和Windows那邊的c++都不是這種形式,他們都是,通過一步一步訪問服務器實現的,整個流程流大概有,建立連接,發送用戶名,發送密碼,設置被動模式,指定工作目錄,建立第二個鏈接,連接數據端口,進行數據傳送,等等一系列操作,這些操作的前提,就是通過自己寫socket的形式實現的,所以,後面覺得自己換成這種方式,因為我自己之前的tcp的那些操作,都是用GCDAsyncSocket這個第三方,實現的,所以,在這之前就在這個sdk的基礎上封裝好了,用的工具類,所以寫起來比較方便,但是途中還是有遇到一些問題,ftp的其實就是tcp的另一種形式,所以通過GCDAsyncSocket這個去實現ftp也是完全可以的,但是,首先得清楚ftp的一些標准協議,比如說,發什麼數據給到服務端,然後應該接收到什麼數據,等等,通過一番谷歌找到了一個靠譜的鏈接,https://www.ibm.com/developerworks/cn/linux/l-cn-socketftp/,這裡詳細講解了,使用socket通信,實現ftp的客戶端程序,整個流程講的很詳細,自己仔細看下就會了,接下來說一下,我寫程序過程中遇到的幾個問題和需要注意的地方。
1,一共需要2個 socket,一個負責命令操作,一個負責數據操作,命令操作的socket斷開之後,需要重新登錄(有些是匿名登陸有些是不需要登錄,我這邊是需要登錄的,然後用戶名和密碼是需要去獲取的,隨機生成的,所以命令socket斷開之後,需要重新去請求用戶名和密碼,然後重新登錄);此外數據socket只能用一次,意思就是,你進行一個下載操作,數據傳輸完了之後,不管服務端有沒有將數據連接斷開(已經建立socket的鏈接,如果鏈接斷開,會收到斷開的信息,已經斷開原因),我們都需要手動將數據socket斷開(這裡只是斷開連接,不是銷毀),然後進行第二次操作的時候,如果命令socket沒有斷開的話, 只需要從設置被動模式開始,進行操作,(針對被動模式,主動模式的話,去上面那個鏈接查看),如果斷開了,則需要從建立命令socket鏈接開始。
2,被動模式的話,每次建立的數據socket都需要重新發送pasv,然後根據收到的數據,計算端口號,重新建立數據socket鏈接,進行數據傳輸。(socket可不用重新創建)
3,下載文件時,需要設置一個緩存區,即不能一次性讀取需下載的數據,我設置的是2048字節,就是每次讀2048,讀完之後,將讀到的數據保存到本地沙盒創建的文件中,這也是實現斷點續傳的前提,將取到的數據寫入到文件時,不是一次性寫入,需要用到NSFileHandle,需要注意的一點是,對同一文件重復寫入數據時,需要注意寫入順序,即設置從文件末尾寫入,[outFile seekToEndOfFile]。
4,上傳文件時,上面的那個鏈接沒有上傳的代碼示例,所以這個很煩,遇到的問題是,我收到了150,然後通過數據socket上傳本地數據到服務端,跟下載一樣,傳完了之後,使用命令socket去接收返回結果,死活收不到順序,可是數據已經傳上去了。後台那邊說,需要傳一個文件大小到服務器,但是後面找了很多,沒發現有說要傳大小,後面才知道,原來是服務端不知道文件大小,所以傳完之後,不會像下載那邊,會自動關掉數據socket,所以,在上傳完數據之後,需要客戶端手動的去關掉數據socket,然後再調用命令socket去讀數據,就能接收到226,傳輸成功的數據信息了。(上傳和下載一樣需要設置緩存區,不能一次性上傳)。
5,暫停時,如果傳輸過程中,手動暫停了,因為上述下載文件時,已經做好了的下載方式,所以,如果暫停了,本地還是會有這個文件,只不過不完整而已,下次繼續下載時,需要告訴服務端一個偏移量,即,斷點續傳。(偏移量通過獲取本地改文件的大小即可得知),還有如果暫停了,只需要斷開數據鏈接即可,繼續時,依據上述,重新請求數據端口,建立鏈接。
6,取消操作時,需先將數據socket斷開,然後發送quit命令,收到221(用戶名和密碼的,還需另外發送注銷用戶的操作),斷開命令鏈接即可。
7,最後附上一個ftp服務端回復數據的狀態碼解析:http://justcoding.iteye.com/blog/835002。
以上就是我通過socket實現ftp客戶端的整個經歷過程,以及遇到的問題和需要注意的地方,有不懂的地方,或者需要交流的在下方留言即可。
以上就是IOS FTP的實現的全文介紹,希望對您學習和使用IOS應用開發有所幫助.[db:作者簡介][db:原文翻譯及解析]【iOS FTP的實現】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!