當前位置:首頁 » 文件管理 » ftp協議實現分片下載

ftp協議實現分片下載

發布時間: 2022-08-27 15:31:51

1. ftp怎麼用啊

FTP,是上傳和下摘協議,有FTP軟體(免費的),申請還一個空間,他會給你一個FTP的地址,FTP伺服器就是一段IP,用戶,是你的用戶名,FTP密碼是你登陸FTP的密碼,可以在你的空間管理看到,空間申請好了以後,你要把網站的文件上傳到空間,需要FTP工具,(也可以用WEB方式上傳,只是速度很慢),FTP工具,可以登陸所有的網站空間,只要有FTP伺服器的TP和你的用戶名,和密碼,就可以管理你網站上的數據,

2. 什麼是FTP客戶端下載器,主要能夠實現哪些功能界面大概是怎樣的

FTP客戶端是利用FTP協議進行下載文件的一種工具。

主要實現,與FTP伺服器驗證,上傳文件,下載文件,斷點續傳等操作?

界面和迅雷類似,當然迅雷中包括FTP客戶端的功能。
這種軟體比較多,有CutuFTP,Filezilla,

3. FTP 關於FTP的上傳與下載,請教!

http://www.pptxx.com/Article/gg/200606/194.html

FTP(File Transfer Protocol)是文件傳輸協議的簡稱。

FTP的作用

正如其名所示:FTP的主要作用,就是讓用戶連接上一個遠程計算機(這些計算機上運行著FTP伺服器程序)察看遠程計算機有哪些文件,然後把文件從遠程計算機上拷到本地計算機,或把本地計算機的文件送到遠程計算機去。

FTP工作原理

拿下傳文件為例,當你啟動FTP從遠程計算機拷貝文件時,你事實上啟動了兩個程序:一個本地機上的FTP客戶程序:它向FTP伺服器提出拷貝文件的請求。另一個是啟動在遠程計算機的上的FTP伺服器程序,它響應你的請求把你指定的文件傳送到你的計算機中。FTP採用「客戶機/伺服器」方式,用戶端要在自己的本地計算機上安裝FTP客戶程序。FTP客戶程序有字元界面和圖形界面兩種。字元界面的FTP的命令復雜、繁多。圖形界面的FTP客戶程序,操作上要簡潔方便的多。

簡單地說,支持FTP協議的伺服器就是FTP伺服器,下面介紹一下什麼是FTP協議(文件傳輸協議)

一般來說,用戶聯網的首要目的就是實現信息共享,文件傳輸是信息共享非常重要的一個內容之一。Internet上早期實現傳輸文件,並不是一件容易的事,我們知道 Internet是一個非常復雜的計算機環境,有PC,有工作站,有MAC,有大型機,據統計連接在Internet上的計算機已有上千萬台,而這些計算機可能運行不同的操作系統,有運行Unix的伺服器,也有運行Dos、Windows的PC機和運行MacOS的蘋果機等等,而各種操作系統之間的文件交流問題,需要建立一個統一的文件傳輸協議,這就是所謂的FTP。基於不同的操作系統有不同的FTP應用程序,而所有這些應用程序都遵守同一種協議,這樣用戶就可以把自己的文件傳送給別人,或者從其它的用戶環境中獲得文件。

與大多數Internet服務一樣,FTP也是一個客戶機/伺服器系統。用戶通過一個支持FTP協議的客戶機程序,連接到在遠程主機上的FTP伺服器程序。用戶通過客戶機程序向伺服器程序發出命令,伺服器程序執行用戶所發出的命令,並將執行的結果返回到客戶機。比如說,用戶發出一條命令,要求伺服器向用戶傳送某一個文件的一份拷貝,伺服器會響應這條命令,將指定文件送至用戶的機器上。客戶機程序代表用戶接收到這個文件,將其存放在用戶目錄中。

在FTP的使用當中,用戶經常遇到兩個概念:"下載"(Download)和"上載"(Upload)。"下載"文件就是從遠程主機拷貝文件至自己的計算機上;"上載"文件就是將文件從自己的計算機中拷貝至遠程主機上。用Internet語言來說,用戶可通過客戶機程序向(從)遠程主機上載(下載)文件。

使用FTP時必須首先登錄,在遠程主機上獲得相應的許可權以後,方可上載或下載文件。也就是說,要想同哪一台計算機傳送文件,就必須具有哪一台計算機的適當授權。換言之,除非有用戶ID和口令,否則便無法傳送文件。這種情況違背了Internet的開放性,Internet上的FTP主機何止千萬,不可能要求每個用戶在每一台主機上都擁有帳號。匿名FTP就是為解決這個問題而產生的。

匿名FTP是這樣一種機制,用戶可通過它連接到遠程主機上,並從其下載文件,而無需成為其注冊用戶。系統管理員建立了一個特殊的用戶ID,名為anonymous, Internet上的任何人在任何地方都可使用該用戶ID。

通過FTP程序連接匿名FTP主機的方式同連接普通FTP主機的方式差不多,只是在要求提供用戶標識ID時必須輸入anonymous,該用戶ID的口令可以是任意的字元串。習慣上,用自己的E-mail地址作為口令,使系統維護程序能夠記錄下來誰在存取這些文件。

值得注意的是,匿名FTP不適用於所有Internet主機,它只適用於那些提供了這項服務的主機。

當遠程主機提供匿名FTP服務時,會指定某些目錄向公眾開放,允許匿名存取。系統中的其餘目錄則處於隱匿狀態。作為一種安全措施,大多數匿名FTP主機都允許用戶從其下載文件,而不允許用戶向其上載文件,也就是說,用戶可將匿名FTP主機上的所有文件全部拷貝到自己的機器上,但不能將自己機器上的任何一個文件拷貝至匿名FTP主機上。即使有些匿名FTP主機確實允許用戶上載文件,用戶也只能將文件上載至某一指定上載目錄中。隨後,系統管理員會去檢查這些文件,他會將這些文件移至另一個公共下載目錄中,供其他用戶下載,利用這種方式,遠程主機的用戶得到了保護,避免了有人上載有問題的文件,如帶病毒的文件。

作為一個Internet用戶,可通過FTP在任何兩台Internet主機之間拷貝文件。但是,實際上大多數人只有一個Internet帳戶,FTP主要用於下載公共文件,例如共享軟體、各公司技術支持文件等。 Internet上有成千上萬台匿名FTP主機,這些主機上存放著數不清的文件,供用戶免費拷貝。實際上,幾乎所有類型的信息,所有類型的計算機程序都可以在Internet上找到。這是Internet吸引我們的重要原因之一。

匿名FTP使用戶有機會存取到世界上最大的信息庫,這個信息庫是日積月累起來的,並且還在不斷增長,永不關閉,涉及到幾乎所有主題。而且,這一切是免費的。

匿名FTP是Internet網上發布軟體的常用方法。Internet之所以能延續到今天,是因為人們使用通過標准協議提供標准服務的程序。像這樣的程序,有許多就是通過匿名FTP發布的,任何人都可以存取它們。

Internet中的有數目巨大的匿名FTP主機以及更多的文件,那麼到底怎樣才能知道某一特定文件位於哪個匿名FTP主機上的那個目錄中呢?這正是Archie伺服器所要完成的工作。Archie將自動在FTP主機中進行搜索,構造一個包含全部文件目錄信息的資料庫,使你可以直接找到所需文件的位置信息。

使用方法:我給你一個帶圖片的教程網址,這樣你比較容易懂。
http://www.gxibvc.net/news/show.aspx?id=234&cid=17

4. 什麼是ftp下載啊是不是就是在網上下東西啊

ftp下載是ftp協議中的一部分,ftp協議也不單純是一個下載協議,更主要的是進行客戶與伺服器之間的數據交換的協議(可以聯網的電腦都能做為伺服器,不要以為是那些超級計算機之間的),這種協議被大多數的網頁寄託網站使用,ftp協議和http協議既實現了對網站的管理(這里你可以把http看做一個下載協議),也能正常瀏覽網頁,但為了保密,設計服務程序時都應設置一個標識(用戶和密碼),我們設計的程序可以通過協議中關於此類的內容進行驗證,從而保證站點類容不被惡改,而ftp下載就需要有多個標識,這里服務程序可以直接以ip地址為標識,設置許可權,當然也需要更高的編程能力(這里的編程語言皆為中級計算機語言,不過我不會,我學高級語言,大概猜的)網上不會笨到用麻煩的方法去讓你下載東西,所以,我們通常所說的下載都是http下載,ftp下載大概只用於秘密下載吧。

5. FTP分享的文件可以下載

從ftp伺服器上下載文件具體操作如下:
FTP伺服器(File Transfer Protocol Server)是在互聯網上提供文件存儲訪問服務的計算機,它們依照FTP協議提供服務。 FTP是File Transfer Protocol(文件傳輸協議)。顧名思義,就是專門用來傳輸文件的協議。簡單地說,支持FTP協議的伺服器就是FTP伺服器。
那麼怎樣從ftp伺服器上下載文件呢?具體操作如下:
ftpget -u zyx -p 123456 192.168.1.156 /hello
ftpget :指令
-u :主機名稱參數
zyx : 主機名稱
-p :密碼參數
123456:密碼
192.168.1.156 : 主機IP
/hello : 主機根目錄下的hello文件

6. ftp伺服器是怎麼回事能不能說的通俗點,ftp下載和普通的下載有什麼不同

FTP伺服器即是在互聯網上提供存儲空間的計算機,它們依照FTP協議(文件傳輸協議)提供服務。簡單地說,支持FTP協議的伺服器就是FTP伺服器。
用戶上互聯網首要目的就是實現信息共享,要知道, Internet是一個非常復雜的計算機環境,據統計連接在Internet上的計算機已有上千萬台各種機型的計算機,而這些計算機分別運行著不同的操作系統,Unix、Dos、Windows的PC機和運行MacOS的蘋果機等等,而各種操作系統之間的文件交流問題,需要建立一個統一的文件傳輸協議,這就是所謂的FTP。基於不同的操作系統有不同的FTP應用程序,而所有這些應用程序都遵守同一種協議,這樣用戶就可以把自己的文件傳送給別人,或者從其它的用戶環境中獲得文件。
與大多數Internet服務一樣,FTP也是一個客戶機、伺服器系統。用戶通過一個支持FTP協議的客戶機程序,連接到在遠程主機上的FTP伺服器程序。用戶通過客戶機程序向伺服器程序發出命令,伺服器程序執行用戶所發出的命令,並將執行的結果返回到客戶機。比如說,用戶發出一條命令,要求伺服器向用戶傳送某一個文件的一份拷貝,伺服器會響應這條命令,將指定文件送至用戶的機器上。客戶機程序代表用戶接收到這個文件,將其存放在用戶目錄中。
在FTP的使用當中,用戶經常遇到兩個概念:"下載"和"上載"。"下載"(Download)文件就是從遠程主機拷貝文件至自己的計算機上;"上載"(Upload)文件就是將文件從自己的計算機中拷貝至遠程主機上。用Internet語言來說,用戶可通過客戶機程序向(從)遠程主機上載(下載)文件。
但使用FTP時必須首先登錄,在遠程主機上獲得相應的許可權以後,方可上傳或下載文件。也就是說,要想同哪一台計算機傳送文件,就必須具有哪一台計算機的適當授權。換言之,除非有用戶ID和口令,否則便無法傳送文件,這是與普通電腦下載最大的不同。
這種情況違背了Internet的開放性,Internet上的FTP主機何止千萬,不可能要求每個用戶在每一台主機上都擁有帳號。匿名FTP就是為解決這個問題而產生的。
匿名FTP是這樣一種機制,用戶可通過它連接到遠程主機上,並從其下載文件,而無需成為其注冊用戶。系統管理員建立了一個特殊的用戶ID,名為anonymous,Internet上的任何人在任何地方都可使用該用戶ID。
通過FTP程序連接匿名FTP主機的方式同連接普通FTP主機的方式差不多,只是在要求提供用戶標識ID時必須輸入anonymous,該用戶ID的口令可以是任意的字元串。習慣上,用自己的E-mail地址作為口令,使系統維護程序能夠記錄下來誰在存取這些文件。
值得注意的是,匿名FTP不適用於所有Internet主機,它只適用於那些提供了這項服務的主機。
當遠程主機提供匿名FTP服務時,會指定某些目錄向公眾開放,允許匿名存取。系統中的其餘目錄則處於隱匿狀態。作為一種安全措施,大多數匿名FTP主機都允許用戶從其下載文件,而不允許用戶向其上載文件,也就是說,用戶可將匿名FTP主機上的所有文件全部拷貝到自己的機器上,但不能將自己機器上的任何一個文件拷貝至匿名FTP主機上。即使有些匿名FTP主機確實允許用戶上載文件,用戶也只能將文件上載至某一指定上載目錄中。隨後,系統管理員會去檢查這些文件,他會將這些文件移至另一個公共下載目錄中,供其他用戶下載,利用這種方式,遠程主機的用戶得到了保護,避免了有人上載有問題的文件,如帶病毒的文件。
作為一個Internet用戶,可通過FTP在任何兩台Internet主機之間拷貝文件。但是,實際上大多數人只有一個Internet帳戶,FTP主要用於下載公共文件,例如共享軟體、各公司技術支持文件等。
Internet上有成千上萬台匿名FTP主機,這些主機上存放著數不清的文件,供用戶免費拷貝。實際上,幾乎所有類型的信息,所有類型的計算機程序都可以在Internet上找到。這是Internet吸引我們的重要原因之一。
匿名FTP使用戶有機會存取到世界上最大的信息庫,這個信息庫是日積月累起來的,並且還在不斷增長,永不關閉,涉及到幾乎所有主題。而且,這一切是免費的。
匿名FTP是Internet網上發布軟體的常用方法。Internet之所以能延續到今天,是因為人們使用通過標准協議提供標准服務的程序。像這樣的程序,有許多就是通過匿名FTP發布的,任何人都可以存取它們。

7. 區域網內部如何通過ftp協議下載另外一台電腦上的文件,格式如 ftp://192.168.1.107/

系統是XP還是win 7?

XP下添加:控制面板-->添加或刪除程序-->添加/刪除windows組件-->internet信息服務(IIS)-->詳細信息-->文件傳輸協議(FTP)服務 勾選。。。點確定----就能添加FTP服務了
Win 7下面基本也一樣。。

手打不容易,望採納

8. 如何快速安裝OSSFTP工具阿里雲OSS FTP安裝圖文詳細教程

OSSFTP工具是一個特殊FTPserver,它接收普通FTP請求後,將對文件、文件夾的操作映射為對OSS的操作,從而使得您可以基於FTP協議來管理存儲在OSS上的文件。

注意生產環境請使用osssdk,OSSFTP工具主要面向個人用戶使用。

主要特性

跨平台:

無論是Windows、Linux還是Mac,無論是32位還是64位操作系統,無論是圖形界面還是命令行都可以運行。

免安裝:

解壓後可直接運行。

免設置:

無需設置即可運行。

透明化:

FTP工具是python寫的,您可以看到完整的源碼,我們稍後也會開源到Github。

主要功能

支持文件和文件夾的上傳、下載、刪除等操作。

通過Multipart方式,分片上傳大文件。

支持大部分FTP指令,可以滿足日常FTP的使用需求。

注意

1.目前在1.0版本中,考慮到安裝部署的簡便,OSSFTP工具沒有支持TLS加密。由於FTP協議是明文傳輸的,

為了防止您的密碼泄漏,建議將FTPserver和client運行在同一台機器上,通過127.0.0.1:port的方式來訪問。

2.不支持rename和move操作。

3.安裝包解壓後的路徑不要含有中文。

4.FTPserver的管理控制頁面在低版本的IE中可能打不開。

5.FTPserver支持的Python版本:Python2.6,Python2.7。

下載

由於Windows不會默認安裝Python2.7,所以安裝包中包含了Python2.7,免去您python安裝配置的麻煩,解壓即可使用。

由於Linux/Mac系統默認會安裝Python2.7或Python2.6,所以安裝包中不再包含可執行的python,只包含了相關依賴庫。

運行

首先解壓之前下載的文件,然後根據環境情況選擇不同的運行方式。

Windows:雙擊運行start.vbs即可

Linux:打開終端,運行 i.$bashstart.sh

Mac:雙擊start.command,或者在終端運行 i.$bashstart.command

上述步驟會啟動一個FTPserver,默認監聽在127.0.0.1的2048埠。同時,為了方便您對FTPserver的狀態進行管控,還會啟動一個web伺服器,監聽在127.0.0.1的8192埠。如果您的系統有圖形界面,還會自動打開控制頁面,

如下所示:

大部分情況不要任何配置,就可以運行一個FTPserver了,如果想對FTPserver進行配置,請注意需要重啟才能生效。

連接到FTPserver推薦使用FileZilla客戶端去連接FTPserver。

下載安裝後,按如下方式連接即可:

主機:127.0.0.1

登錄類型:正常

用戶:access_key_id/bucket_name

密碼:access_key_secret

注意:

用戶中,/是必須的,如用戶

tSxyiUM3NKswPMEp/test-hz-jh-002。

-access_key_id和access_key_secret的獲取

高級使用

通過控制頁面管理FTPserver

修改監聽地址

如果需要通過網路來訪問FTPserver,那麼需要修改監聽地址,因為默認的監聽地址127.0.0.1隻允許來自本地的訪問。可以修改成內網ip或公網ip。

修改監聽埠

修改FTPserver監聽的埠,建議埠大於1024,因為監聽1024以下的埠時需要管理員許可權.

修改日誌等級

設置FTPserver的日誌級別。FTPserver的日誌會輸出到data/ossftp/目錄下,可以通過控制頁面的日誌按鈕在線查看。默認的日誌界別為INFO,列印的日誌信息較少,如果需要更詳細的日誌信息,可以修改為DEBUG模式。如果希望減少日誌的輸出,可以設置級別為WARNING或ERROR等。

設置Bucketendpoints

FTPserver默認會探索bucket的所屬location信息,隨後將請求發到對應的region(如oss-cn-hangzhou.aliyuncs.com或oss-cn-beijing.aliyuncs.com),FTPserver會優先嘗試內網訪問oss。如果您設置了bucketendpoints,如設置為test-bucket-a.oss-cn-hangzhou.aliyuncs.com,那麼當訪問test-bucket-a時,就會使用oss-cn-hangzhou.aliyuncs.com域名。

注意

所有修改都需要重啟才能生效。

上述的所有修改其實都是修改的ftp根目錄下的config.json,所以您可以直接修改該文件。

直接啟動FTPserver(Linux/Mac)

可以直接啟動ossftp目錄下的ftpserver.py,免去web_server的開銷。

1.python ossftp/ftpserver.py

配置修改方式同上。

可能遇到的問題

如果連接FTPserver時,遇到以下錯誤:

有兩種可能:

輸入的access_key_id和access_key_secret有誤。

解決 :請輸入正確的信息後再重試。

所用的access_key信息為ram子賬戶的access_key,而子賬戶不具有Listbuckets許可權。

解決 :當使用子賬戶訪問時,請在控制頁面中指定bucketendpoints,即告訴FTPserver某個bucket應該用什麼endpoint來訪問。同時,子賬戶也需要一些必須的許可權,關於使用ram訪問oss時的訪問控制。

只讀訪問

OSSFTP工具需要的許可權列表為ListObjects、GetObject、HeadObject。關於如何創建一個具有隻讀訪問的ram子賬戶,請參考圖文教程如何結合ram實現文件共享。

上傳文件

如果允許ram子賬戶上傳文件,還需要PutObject。

刪除文件

如果允許ram子賬戶刪除文件,還需要DeleteObject。

如果您在Linux下運行FTPserver,然後用FileZilla連接時遇到如下錯誤:

501 can't decode path (server filesystem encoding is ANSI_X3.4-1968)

一般是因為本地的中文編碼有問題。在將要運行start.sh的終端中輸入下面的命令,然後再重新啟動即可。

1 .$ export LC_ALL=en_US.UTF-8; export LANG="en_US.UTF-8"; locale

9. 關於如何實現FTP上傳或者下載帶進度和速率的實現方法

在這里需要說明的是,該方式是通過其他代碼進行改進的。 首先我們需要定義一個委託,用來實現傳輸過程中傳遞文件的總數,已完成的位元組數和速度,方便客戶端界面上調用。 public delegate void TransferProcess(long total,long finished,double speed); 調用代碼就不舉例了 接下來我們建立一個FTPClient類,該類基於socket和FTP協議實現了連接FTP服務,建立目錄,上傳文件,下載文件等主要方法。結構如下: 需要注意的是,我們需要定一個事件event TransferProcess OnTransferProcess;該事件在實例化FTPClient之後需要調用,這個事件對實現進度條和速率是非常重要的。為了實現速率我們還需要定義個公開的成員startTime(開始時間)。我們現在主要是看一下如何上傳的。 /// /// 上傳一個文件 /// /// 本地文件名 public void Put(string strFileName) { //連接伺服器 if (!bConnected) { Connect(); } UpdateStatus = true; //建立socket連接 Socket socketData = CreateDataSocket(); //向FTP伺服器發生存儲命令 SendCommand("STOR " + Path.GetFileName(strFileName)); //如何伺服器返回的信息不是我們所需要的,就拋出異常 if (!(iReplyCode == 125 || iReplyCode == 150)) { throw new IOException(strReply.Substring(4)); } //建立本地文件的數據流 FileStream input = new FileStream(strFileName, FileMode.Open); int iBytes = 0; long total = input.Length;//該成員主要記錄文件的總位元組數,注意這里使用長整型,是為了突破只能傳輸2G左右的文件的限制 long finished = 0;//該成員主要記錄已經傳輸完成的位元組數,注意這里使用長整型,是為了突破只能傳輸2G左右的文件的限制 double speed = 0;//記錄傳輸的速率 while ((iBytes = input.Read(buffer, 0, buffer.Length)) > 0)//循環從本地數據流中讀取數據到緩沖區 { //Console.WriteLine(startTime.ToString()); socketData.Send(buffer, iBytes, 0);//將緩沖區的數據發送到FTP伺服器 DateTime endTime = DateTime.Now;//每次發送數據的結束時間 TimeSpan ts = endTime - startTime;//計算每次發送數據的時間間隔 finished += iBytes;//計算完成的位元組數. Console.WriteLine(ts.Milliseconds); //計算速率,注意finished是位元組,所以需要換算沖K位元組 if (ts.Milliseconds > 0) { speed = (double)(finished / ts.TotalMilliseconds); speed = Math.Round(speed * 1000 / 1024, 2); } //這里是必不可少的,否則你無法實現進度條 //如果傳輸進度事件被實例化,而且從本地數據流中讀取數據不是空的並完成的位元組數也不為空的話,則實現委託. if (OnTransferProcess != null&&iBytes>0&&finished>0) { OnTransferProcess(total, finished,speed); } } UpdateStatus = false; finished = 0; input.Close();//當傳輸完成之後需要關閉數據流,以便下次訪問. if (socketData.Connected) { socketData.Close();//關閉當前的socket } if (!(iReplyCode == 226 || iReplyCode == 250)) { ReadReply(); if (!(iReplyCode == 226 || iReplyCode == 250)) { UpdateStatus = false; throw new IOException(strReply.Substring(4)); } } } 上面代碼中注釋寫得比較詳細,這里就不再一一講解了,關於下載中實現進度條和速率的問題可以參考以上代碼進行修改. 完整的代碼如下: using System; using System.net; using System.IO; using System.Text; using System.net.Sockets; namespace MMSEncoder { public delegate void TransferProcess(long total,long finished,double speed); /// /// FTP Client /// public class FTPClient { public event TransferProcess OnTransferProcess; public bool UpdateStatus = true; public DateTime startTime; private bool IsAbortConnect = false; #region 構造函數 /// /// 預設構造函數 /// public FTPClient() { strRemoteHost = ""; strRemotePath = ""; strRemoteUser = ""; strRemotePass = ""; strRemotePort = 21; bConnected = false; } /// /// 構造函數 /// /// FTP伺服器IP地址 /// 當前伺服器目錄 /// 登錄用戶賬號 /// 登錄用戶密碼 /// FTP伺服器埠 public FTPClient(string remoteHost, string remotePath, string remoteUser, string remotePass, int remotePort) { strRemoteHost = remoteHost; strRemotePath = remotePath; strRemoteUser = remoteUser; strRemotePass = remotePass; strRemotePort = remotePort; Connect(); } #endregion #region 登陸欄位、屬性 /// /// FTP伺服器IP地址 /// private string strRemoteHost; public string RemoteHost { get { return strRemoteHost; } set { strRemoteHost = value; } } /// /// FTP伺服器埠 /// private int strRemotePort; public int RemotePort { get { return strRemotePort; } set { strRemotePort = value; } } /// /// 當前伺服器目錄 /// private string strRemotePath; public string RemotePath { get { return strRemotePath; } set { strRemotePath = value; } } /// /// 登錄用戶賬號 /// private string strRemoteUser; public string RemoteUser { set { strRemoteUser = value; } } /// /// 用戶登錄密碼 /// private string strRemotePass; public string RemotePass { set { strRemotePass = value; } } /// /// 是否登錄 /// private Boolean bConnected; public bool Connected { get { return bConnected; } } #endregion #region 鏈接 /// /// 建立連接 /// public void Connect() { //if (IsAbortConnect) throw new IOException("用戶強制終止了FTP"); socketControl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ep = new IPEndPoint(IPAddress.Parse(RemoteHost), strRemotePort); // 鏈接 try { socketControl.Connect(ep); } catch (Exception) { throw new IOException("無法連接到遠程伺服器!"); } // 獲取應答碼 ReadReply(); if (iReplyCode != 220) { DisConnect(); throw new IOException(strReply.Substring(4)); } // 登陸 SendCommand("USER " + strRemoteUser); if (!(iReplyCode == 331 || iReplyCode == 230)) { CloseSocketConnect();//關閉連接 throw new IOException(strReply.Substring(4)); } if (iReplyCode != 230) { SendCommand("PASS " + strRemotePass); if (!(iReplyCode == 230 || iReplyCode == 202)) { CloseSocketConnect();//關閉連接 throw new IOException(strReply.Substring(4)); } } bConnected = true; // 切換到初始目錄 if (!string.IsNullOrEmpty(strRemotePath)) { ChDir(strRemotePath); } } /// /// 關閉連接 /// public void DisConnect() { if (socketControl != null) { SendCommand("QUIT"); } CloseSocketConnect(); } public void AbortConnect() { if (socketControl != null) { SendCommand("ABOR"); } IsAbortConnect = true; //CloseSocketConnect(); } #endregion #region 傳輸模式 /// /// 傳輸模式:二進制類型、ASCII類型 /// public enum TransferType { Binary, ASCII }; /// /// 設置傳輸模式 /// /// 傳輸模式 public void SetTransferType(TransferType ttType) { if (ttType == TransferType.Binary) { SendCommand("TYPE I");//binary類型傳輸 } else { SendCommand("TYPE A");//ASCII類型傳輸 } if (iReplyCode != 200) { throw new IOException(strReply.Substring(4)); } else { trType = ttType; } } /// /// 獲得傳輸模式 /// /// 傳輸模式 public TransferType GetTransferType() { return trType; } #endregion #region 文件操作 /// /// 獲得文件列表 /// /// 文件名的匹配字元串 /// public string[] Dir(string strMask) { // 建立鏈接 if (!bConnected) { Connect(); } //建立進行數據連接的socket Socket socketData = CreateDataSocket(); //傳送命令 SendCommand("NLST " + strMask); //分析應答代碼 if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226)) { throw new IOException(strReply.Substring(4)); } //獲得結果 strMsg = ""; while (true) { int iBytes = socketData.Receive(buffer, buffer.Length, 0); strMsg += GB2312.GetString(buffer, 0, iBytes); if (iBytes < buffer.Length) { break; } } char[] seperator = { '
' }; string[] strsFileList = strMsg.Split(seperator); socketData.Close();//數據socket關閉時也會有返回碼 if (iReplyCode != 226) { ReadReply(); if (iReplyCode != 226) { throw new IOException(strReply.Substring(4)); } } return strsFileList; } /// /// 獲取文件大小 /// /// 文件名 /// 文件大小 public long GetFileSize(string strFileName) { if (!bConnected) { Connect(); } SendCommand("SIZE " + Path.GetFileName(strFileName)); long lSize = 0; if (iReplyCode == 213) { lSize = Int64.Parse(strReply.Substring(4)); } else { throw new IOException(strReply.Substring(4)); } return lSize; } /// /// 刪除 /// /// 待刪除文件名 public void Delete(string strFileName) { if (!bConnected) { Connect(); } SendCommand("DELE " + strFileName); if (iReplyCode != 250) { throw new IOException(strReply.Substring(4)); } } /// /// 重命名(如果新文件名與已有文件重名,將覆蓋已有文件) /// /// 舊文件名 /// 新文件名 public void Rename(string strOldFileName, string strNewFileName) { if (!bConnected) { Connect(); } SendCommand("RNFR " + strOldFileName); if (iReplyCode != 350) { throw new IOException(strReply.Substring(4)); } // 如果新文件名與原有文件重名,將覆蓋原有文件 SendCommand("RNTO " + strNewFileName); if (iReplyCode != 250) { throw new IOException(strReply.Substring(4)); } } #endregion #region 上傳和下載 /// /// 下載一批文件 /// /// 文件名的匹配字元串 /// 本地目錄(不得以\結束) public void Get(string strFileNameMask, string strFolder) { if (!bConnected) { Connect(); } string[] strFiles = Dir(strFileNameMask); foreach (string strFile in strFiles) { if (!strFile.Equals(""))//一般來說strFiles的最後一個元素可能是空字元串 { if (strFile.LastIndexOf(".") > -1) { Get(strFile.Replace("\r", ""), strFolder, strFile.Replace("\r", "")); } } } } /// /// 下載一個文件 /// /// 要下載的文件名 /// 本地目錄(不得以\結束) /// 保存在本地時的文件名 public void Get(string strRemoteFileName, string strFolder, string strLocalFileName) { if (!bConnected) { Connect(); } SetTransferType(TransferType.Binary); if (strLocalFileName.Equals("")) { strLocalFileName = strRemoteFileName; } if (!File.Exists(strLocalFileName)) { Stream st = File.Create(strLocalFileName); st.Close(); } FileStream output = new FileStream(strFolder + "\\" + strLocalFileName, FileMode.Create); Socket socketData = CreateDataSocket(); SendCommand("RETR " + strRemoteFileName); if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226 || iReplyCode == 250)) { throw new IOException(strReply.Substring(4)); } while (true) { int iBytes = socketData.Receive(buffer, buffer.Length, 0); output.Write(buffer, 0, iBytes); if (iBytes <= 0) { break; } } output.Close(); if (socketData.Connected) { socketData.Close(); } if (!(iReplyCode == 226 || iReplyCode == 250)) { ReadReply(); if (!(iReplyCode == 226 || iReplyCode == 250)) { throw new IOException(strReply.Substring(4)); } } } /// /// 上傳一批文件 /// /// 本地目錄(不得以\結束) /// 文件名匹配字元(可以包含*和?) public void Put(string strFolder, string strFileNameMask) { string[] strFiles = Directory.GetFiles(strFolder, strFileNameMask); foreach (string strFile in strFiles) { //strFile是完整的文件名(包含路徑) Put(strFile); } } /// /// 上傳一個文件 /// /// 本地文件名 public void Put(string strFileName) { if (!bConnected) { Connect(); } UpdateStatus = true; Socket socketData = CreateDataSocket(); SendCommand("STOR " + Path.GetFileName(strFileName)); if (!(iReplyCode == 125 || iReplyCode == 150)) { throw new IOException(strReply.Substring(4)); } FileStream input = new FileStream(strFileName, FileMode.Open); int iBytes = 0; long total = input.Length; long finished = 0; //DateTime startTime = DateTime.Now; double speed = 0; while ((iBytes = input.Read(buffer, 0, buffer.Length)) > 0) { Console.WriteLine(startTime.ToString()); socketData.Send(buffer, iBytes, 0); DateTime endTime = DateTime.Now; TimeSpan ts = endTime - startTime; finished += iBytes; Console.WriteLine(ts.Milliseconds); if (ts.Milliseconds > 0) { speed = (double)(finished / ts.TotalMilliseconds); speed = Math.Round(speed * 1000 / 1024, 2); } if (OnTransferProcess != null&&iBytes>0&&finished>0) { OnTransferProcess(total, finished,speed); } } UpdateStatus = false; finished = 0; input.Close(); if (socketData.Connected) { socketData.Close(); } if (!(iReplyCode == 226 || iReplyCode == 250)) { ReadReply(); if (!(iReplyCode == 226 || iReplyCode == 250)) { UpdateStatus = false; throw new IOException(strReply.Substring(4)); } } } #endregion #region 目錄操作 /// /// 創建目錄 /// /// 目錄名 public void MkDir(string strDirName) { if (!bConnected) { Connect(); } SendCommand("MKD " + strDirName); if (iReplyCode != 257) { throw new IOException(strReply.Substring(4)); } } /// /// 刪除目錄 /// /// 目錄名 public void RmDir(string strDirName) { if (!bConnected) { Connect(); } SendCommand("RMD " + strDirName); if (iReplyCode != 250) { throw new IOException(strReply.Substring(4)); } } /// /// 改變目錄 /// /// 新的工作目錄名 public void ChDir(string strDirName) { if (strDirName.Equals(".") || strDirName.Equals("")) { return; } if (!bConnected) { Connect(); } SendCommand("CWD " + strDirName); if (iReplyCode != 250) { throw new IOException(strReply.Substring(4)); } this.strRemotePath = strDirName; } #endregion #region 內部變數 /// /// 伺服器返回的應答信息(包含應答碼) /// private string strMsg; /// /// 伺服器返回的應答信息(包含應答碼) /// private string strReply; /// /// 伺服器返回的應答碼 /// private int iReplyCode; /// /// 進行控制連接的socket /// private Socket socketControl; /// /// 傳輸模式 /// private TransferType trType; /// /// 接收和發送數據的緩沖區 /// private static int BLOCK_SIZE = Int16.MaxValue; Byte[] buffer = new Byte[BLOCK_SIZE]; /// /// 編碼方式(為防止出現中文亂碼採用 GB2312編碼方式) /// Encoding GB2312 = Encoding.Default ;//Encoding.GetEncoding("gb2312"); #endregion #region 內部函數 /// /// 將一行應答字元串記錄在strReply和strMsg /// 應答碼記錄在iReplyCode /// private void ReadReply() { strMsg = ""; strReply = ReadLine(); iReplyCode = Int32.Parse(strReply.Substring(0, 3)); } /// /// 建立進行數據連接的socket /// /// 數據連接socket private Socket CreateDataSocket() { SendCommand("PASV"); if (iReplyCode != 227) { throw new IOException(strReply.Substring(4)); } int index1 = strReply.IndexOf('('); int index2 = strReply.IndexOf(')'); string ipData = strReply.Substring(index1 + 1, index2 - index1 - 1); int[] parts = new int[6]; int len = ipData.Length; int partCount = 0; string buf = ""; for (int i = 0; i < len && partCount <= 6; i++) { char ch = Char.Parse(ipData.Substring(i, 1)); if (Char.IsDigit(ch)) buf += ch; else if (ch != ',') { throw new IOException("Malformed PASV strReply: " + strReply); } if (ch == ',' || i + 1 == len) { try { parts[partCount++] = Int32.Parse(buf); buf = ""; } catch (Exception) { throw new IOException("Malformed PASV strReply: " + strReply); } } } string ipAddress = parts[0] + "." + parts[1] + "." + parts[2] + "." + parts[3]; int port = (parts[4] << 8) + parts[5]; Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ep = new IPEndPoint(IPAddress.Parse(ipAddress), port); try { s.Connect(ep); } catch (Exception) { throw new IOException("無法連接伺服器"); } return s; } /// /// 關閉socket連接(用於登錄以前) /// private void CloseSocketConnect() { if (socketControl != null) { socketControl.Close(); socketControl = null; } bConnected = false; } /// /// 讀取Socket返回的所有字元串 /// /// 包含應答碼的字元串列 private string ReadLine() { while (true) { int iBytes = socketControl.Receive(buffer, buffer.Length, 0); strMsg += GB2312.GetString(buffer, 0, iBytes); if (iBytes < buffer.Length) { break; } } char[] seperator = { '
' }; string[] mess = strMsg.Split(seperator); if (strMsg.Length > 2) { strMsg = mess[mess.Length - 2]; //seperator[0]是10,換行符是由13和0組成的,分隔後10後面雖沒有字元串, //但也會分配為空字元串給後面(也是最後一個)字元串數組, //所以最後一個mess是沒用的空字元串 //但為什麼不直接取mess[0],因為只有最後一行字元串應答碼與信息之間有空格 } else { strMsg = mess[0]; } if (!strMsg.Substring(3, 1).Equals(" "))//返回字元串正確的是以應答碼(如220開頭,後面接一空格,再接問候字元串) { return ReadLine(); } return strMsg; } /// /// 發送命令並獲取應答碼和最後一行應答字元串 /// /// 命令 private void SendCommand(String strCommand) { Byte[] cmdBytes = GB2312.GetBytes((strCommand + "\r
").ToCharArray()); socketControl.Send(cmdBytes, cmdBytes.Length, 0); ReadReply(); } #endregion } }

熱點內容
洗腦緩存 發布:2024-10-13 11:59:53 瀏覽:920
安卓導航怎麼關閉自動升級 發布:2024-10-13 11:51:53 瀏覽:664
電腦配置120加1t什麼意思 發布:2024-10-13 11:51:10 瀏覽:410
方舟如何創建建造伺服器 發布:2024-10-13 11:21:05 瀏覽:597
win7用戶文件夾改名 發布:2024-10-13 11:16:53 瀏覽:702
小區門密碼如何重置 發布:2024-10-13 11:16:08 瀏覽:883
投訴上傳評證 發布:2024-10-13 11:03:55 瀏覽:427
pn結演算法 發布:2024-10-13 10:58:12 瀏覽:264
網路課程腳本 發布:2024-10-13 10:24:56 瀏覽:503
網上買電腦如何查看配置 發布:2024-10-13 10:17:29 瀏覽:797