日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

iOS FTP客户端的见解

發(fā)布時(shí)間:2024/1/1 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS FTP客户端的见解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

公司的一個(gè)項(xiàng)目功能,需要通過(guò)ftp實(shí)現(xiàn)一系列功能,主要功能有三個(gè),

1,獲取服務(wù)器上的某個(gè)路徑下的內(nèi)容;

2,將本地的圖片上傳至服務(wù)器;

3,將服務(wù)器上的文件下載到本地。

最開(kāi)始做的時(shí)候,定的方向是,網(wǎng)上找ftp的sdk,或者demo,然后集成到項(xiàng)目中來(lái),在Github上找了很多也下下來(lái),試了,最后決定用的是LxFTPRequest

使用起來(lái)也比較簡(jiǎn)單,只需要將對(duì)應(yīng)的參數(shù)傳入,然后block回調(diào)那里做相應(yīng)的處理即可,但是,做到后面快完工的時(shí)候,測(cè)試發(fā)現(xiàn),內(nèi)網(wǎng)所有操作都o(jì)k,一切到外網(wǎng),直接報(bào)錯(cuò),錯(cuò)誤信息,還是unknow,然后就去換了其他的demo,還試了蘋(píng)果官方的ftp demo,https://developer.apple.com/library/content/samplecode/SimpleFTPSample/Introduction/Intro.html,錯(cuò)誤信息都一樣,沒(méi)辦法解決,后面通過(guò)Wireshark抓包分析,得到一個(gè)錯(cuò)誤信息,500,oops啥的,最后還是沒(méi)辦法解決,可是安卓那邊是ok的。(問(wèn)題應(yīng)該是在于客戶(hù)端與服務(wù)端,在外網(wǎng)交互時(shí),端口轉(zhuǎn)發(fā)的問(wèn)題,內(nèi)網(wǎng)時(shí),不存在端口轉(zhuǎn)發(fā)和IP映射的問(wèn)題,所以?xún)?nèi)網(wǎng)ok)

后面得知,我這邊的訪問(wèn)方式和安卓那邊不一樣,我這邊是通過(guò),將IP/域名,加端口號(hào),加上目標(biāo)路徑,拼接成一個(gè)url鏈接,然后進(jìn)行訪問(wèn),請(qǐng)求,而安卓,和windows那邊的c++都不是這種形式,他們都是,通過(guò)一步一步訪問(wèn)服務(wù)器實(shí)現(xiàn)的,整個(gè)流程流大概有,建立連接,發(fā)送用戶(hù)名,發(fā)送密碼,設(shè)置被動(dòng)模式,指定工作目錄,建立第二個(gè)鏈接,連接數(shù)據(jù)端口,進(jìn)行數(shù)據(jù)傳送,等等一系列操作,這些操作的前提,就是通過(guò)自己寫(xiě)socket的形式實(shí)現(xiàn)的,所以,后面覺(jué)得自己換成這種方式,因?yàn)槲易约褐暗膖cp的那些操作,都是用GCDAsyncSocket這個(gè)第三方,實(shí)現(xiàn)的,所以,在這之前就在這個(gè)sdk的基礎(chǔ)上封裝好了,用的工具類(lèi),所以寫(xiě)起來(lái)比較方便,但是途中還是有遇到一些問(wèn)題,ftp的其實(shí)就是tcp的另一種形式,所以通過(guò)GCDAsyncSocket這個(gè)去實(shí)現(xiàn)ftp也是完全可以的,但是,首先得清楚ftp的一些標(biāo)準(zhǔn)協(xié)議,比如說(shuō),發(fā)什么數(shù)據(jù)給到服務(wù)端,然后應(yīng)該接收到什么數(shù)據(jù),等等,通過(guò)一番谷歌找到了一個(gè)靠譜的鏈接,https://www.ibm.com/developerworks/cn/linux/l-cn-socketftp/,這里詳細(xì)講解了,使用socket通信,實(shí)現(xiàn)ftp的客戶(hù)端程序,整個(gè)流程講的很詳細(xì),自己仔細(xì)看下就會(huì)了,接下來(lái)說(shuō)一下,我寫(xiě)程序過(guò)程中遇到的幾個(gè)問(wèn)題和需要注意的地方。

1,一共需要2個(gè) socket,一個(gè)負(fù)責(zé)命令操作,一個(gè)負(fù)責(zé)數(shù)據(jù)操作,命令操作的socket斷開(kāi)之后,需要重新登錄(有些是匿名登陸有些是不需要登錄,我這邊是需要登錄的,然后用戶(hù)名和密碼是需要去獲取的,隨機(jī)生成的,所以命令socket斷開(kāi)之后,需要重新去請(qǐng)求用戶(hù)名和密碼,然后重新登錄);此外數(shù)據(jù)socket只能用一次,意思就是,你進(jìn)行一個(gè)下載操作,數(shù)據(jù)傳輸完了之后,不管服務(wù)端有沒(méi)有將數(shù)據(jù)連接斷開(kāi)(已經(jīng)建立socket的鏈接,如果鏈接斷開(kāi),會(huì)收到斷開(kāi)的信息,已經(jīng)斷開(kāi)原因),我們都需要手動(dòng)將數(shù)據(jù)socket斷開(kāi)(這里只是斷開(kāi)連接,不是銷(xiāo)毀),然后進(jìn)行第二次操作的時(shí)候,如果命令socket沒(méi)有斷開(kāi)的話, 只需要從設(shè)置被動(dòng)模式開(kāi)始,進(jìn)行操作,(針對(duì)被動(dòng)模式,主動(dòng)模式的話,去上面那個(gè)鏈接查看),如果斷開(kāi)了,則需要從建立命令socket鏈接開(kāi)始。

2,被動(dòng)模式的話,每次建立的數(shù)據(jù)socket都需要重新發(fā)送pasv,然后根據(jù)收到的數(shù)據(jù),計(jì)算端口號(hào),重新建立數(shù)據(jù)socket鏈接,進(jìn)行數(shù)據(jù)傳輸。(socket可不用重新創(chuàng)建)

3,下載文件時(shí),需要設(shè)置一個(gè)緩存區(qū),即不能一次性讀取需下載的數(shù)據(jù),我設(shè)置的是2048字節(jié),就是每次讀2048,讀完之后,將讀到的數(shù)據(jù)保存到本地沙盒創(chuàng)建的文件中,這也是實(shí)現(xiàn)斷點(diǎn)續(xù)傳的前提,將取到的數(shù)據(jù)寫(xiě)入到文件時(shí),不是一次性寫(xiě)入,需要用到NSFileHandle,需要注意的一點(diǎn)是,對(duì)同一文件重復(fù)寫(xiě)入數(shù)據(jù)時(shí),需要注意寫(xiě)入順序,即設(shè)置從文件末尾寫(xiě)入,[outFileseekToEndOfFile]。

4,上傳文件時(shí),上面的那個(gè)鏈接沒(méi)有上傳的代碼示例,所以這個(gè)很煩,遇到的問(wèn)題是,我收到了150,然后通過(guò)數(shù)據(jù)socket上傳本地?cái)?shù)據(jù)到服務(wù)端,跟下載一樣,傳完了之后,使用命令socket去接收返回結(jié)果,死活收不到數(shù)據(jù),可是數(shù)據(jù)已經(jīng)傳上去了。后臺(tái)那邊說(shuō),需要傳一個(gè)文件大小到服務(wù)器,但是后面找了很多,沒(méi)發(fā)現(xiàn)有說(shuō)要傳大小,后面才知道,原來(lái)是服務(wù)端不知道文件大小,所以傳完之后,不會(huì)像下載那邊,會(huì)自動(dòng)關(guān)掉數(shù)據(jù)socket,所以,在上傳完數(shù)據(jù)之后,需要客戶(hù)端手動(dòng)的去關(guān)掉數(shù)據(jù)socket,然后再調(diào)用命令socket去讀數(shù)據(jù),就能接收到226,傳輸成功的數(shù)據(jù)信息了。(上傳和下載一樣需要設(shè)置緩存區(qū),不能一次性上傳)。

5,暫停時(shí),如果傳輸過(guò)程中,手動(dòng)暫停了,因?yàn)樯鲜鱿螺d文件時(shí),已經(jīng)做好了的下載方式,所以,如果暫停了,本地還是會(huì)有這個(gè)文件,只不過(guò)不完整而已,下次繼續(xù)下載時(shí),需要告訴服務(wù)端一個(gè)偏移量,即,斷點(diǎn)續(xù)傳。(偏移量通過(guò)獲取本地改文件的大小即可得知),還有如果暫停了,只需要斷開(kāi)數(shù)據(jù)鏈接即可,繼續(xù)時(shí),依據(jù)上述,重新請(qǐng)求數(shù)據(jù)端口,建立鏈接。

6,取消操作時(shí),需先將數(shù)據(jù)socket斷開(kāi),然后發(fā)送quit命令,收到221(用戶(hù)名和密碼的,還需另外發(fā)送注銷(xiāo)用戶(hù)的操作),斷開(kāi)命令鏈接即可。

7,最后附上一個(gè)ftp服務(wù)端回復(fù)數(shù)據(jù)的狀態(tài)碼解析:http://justcoding.iteye.com/blog/835002。

以上就是我通過(guò)socket實(shí)現(xiàn)ftp客戶(hù)端的整個(gè)經(jīng)歷過(guò)程,以及遇到的問(wèn)題和需要注意的地方,有不懂的地方,或者需要交流的在下方留言即可。

有關(guān)下載和上傳的整個(gè)操作截圖,在我下面的文章中,有需要的可以去查看了解。

總結(jié)

以上是生活随笔為你收集整理的iOS FTP客户端的见解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。