用Java實現FTP伺服器解決方案

2021-08-23 13:19:14 字數 3197 閱讀 5455

ftp 命令

ftp 的主要操作都是基於各種命令基礎之上的。常用的命令有:

· 設定傳輸模式,它包括ascⅱ(文字) 和binary 二進位制模式;

· 目錄操作,改變或顯示遠端計算機的當前目錄(cd、dir/ls 命令);

· 連線操作,open命令用於建立同遠端計算機的連線;close命令用於關閉連線;

· 傳送操作,put命令用於傳送檔案到遠端計算機;mput 命令用於傳送多個檔案到遠端計算機;

· 獲取操作,get命令用於接收乙個檔案;mget命令用於接收多個檔案。

程式設計思路

根據ftp 的工作原理,在主函式中建立乙個伺服器套接字埠,等待客戶端請求,一旦客戶端請求被接受,伺服器程式就建立乙個伺服器分執行緒,處理客戶端的命令。如果客戶端需要和伺服器端進行檔案的傳輸,則建立乙個新的套接字連線來完成檔案的操作。

程式設計技巧說明

1.主函式設計

在主函式中,完成伺服器端口的偵聽和服務執行緒的建立。我們利用乙個靜態字串變數initdir 來儲存伺服器執行緒執行時所在的工作目錄。伺服器的初始工作目錄是由程式執行時使用者輸入的,預設為c盤的根目錄。

具體的**如下:

public class ftpserver extends threadelse 

int i = 1;

try

}catch(exception e){}

}

2. 執行緒類的設計

執行緒類的主要設計都是在run()方法中實現。用run()方法得到客戶端的套接字資訊,根據套接字得到輸入流和輸出流,向客戶端傳送歡迎資訊。

3. ftp 命令的處理

(1) 訪問控制命令

· user name(user) 和 password (pass) 命令處理**如下:

if(str.startswith("user")) 

if(str.startswith("pass"))

out.println("230 user "+user+" logged in.");

user 命令和 password 命令分別用來提交客戶端使用者輸入的使用者名稱和口令。

· cwd (change working directory) 命令處理**如下:

if(str.startswith("cwd"))

該命令改變工作目錄到使用者指定的目錄。

· cdup (change to parent directory) 命令處理**如下:

if(str.startswith("cdup"))
if(str.startswith("quit"))

該命令退出及關閉與伺服器的連線,輸出good bye。

(2) 傳輸引數命令

· port命令處理**如下:

if(str.startswith("port"))  

for(int l=j+1;l<=i;l++)

tempport = integer.parseint(str1) * 16 *16 +integer.parseint(str2);

}

使用該命令時,客戶端必須傳送客戶端用於接收資料的32位ip 位址和16位 的tcp 埠號。這些資訊以8位為一組,使用十進位制傳輸,中間用逗號隔開。

· type命令處理**如下:

if(str.startswith("type"))

type 命令用來完成型別設定。

(3) ftp 服務命令

· retr (reteieve) 和 store (store)命令處理的**

if(str.startswith("retr")) 

outsocket.close();

out.println("226 transfer complete");

outfile.close();

tempsocket.close();

} catch(ioexception e){}

} if(str.startswith("stor"))

insocket.close();

out.println("226 transfer complete");

infile.close();

tempsocket.close();

} catch(ioexception e){}

}

檔案傳輸命令包括從伺服器中獲得檔案retr和向伺服器中傳送檔案stor,這兩個命令的處理非常類似。處理retr命令時,首先得到使用者要獲得的檔案的名稱,根據名稱建立乙個檔案輸入流,然後和客戶端建立臨時套接字連線,並得到乙個輸出流。隨後,將檔案輸入流中的資料讀出並借助於套接字輸出流傳送到客戶端,傳輸完畢以後,關閉流和臨時套接字。

stor 命令的處理也是同樣的過程,只是方向正好相反。

· dele (delete)命令處理**如下:

if(str.startswith("dele"))

dele 命令用於刪除伺服器上的指定檔案。

· list命令處理**如下:

if(str.startswith("list"))  

else

out2.println(strtype+dirstructure[i]);

} tempsocket.close();

out.println("226 transfer complete");

} catch(ioexception e){}

list 命令用於向客戶端返回伺服器中工作目錄下的目錄結構,包括檔案和目錄的列表。處理這個命令時,先建立乙個臨時的套接字向客戶端傳送目錄資訊。這個套接字的目的埠號預設為1,然後為當前工作目錄建立file 物件,利用該物件的list()方法得到乙個包含該目錄下所有檔案和子目錄名稱的字串陣列,然後根據名稱中是否含有檔名中特有的「.」來區別目錄和檔案。最後,將得到的名稱陣列通過臨時套接字傳送到客戶端。

用Java實現FTP伺服器

ftp 命令 ftp 的主要操作都是基於各種命令基礎之上的。常用的命令有 設定傳輸模式,它包括asc 文字 和binary 二進位制模式 目錄操作,改變或顯示遠端計算機的當前目錄 cd dir ls 命令 連線操作,open命令用於建立同遠端計算機的連線 close命令用於關閉連線 傳送操作,put...

用Java實現FTP伺服器

ftp 命令 ftp 的主要操作都是基於各種命令基礎之上的。常用的命令有 設定傳輸模式,它包括asc 文字 和binary 二進位制模式 目錄操作,改變或顯示遠端計算機的當前目錄 cd dir ls 命令 連線操作,open命令用於建立同遠端計算機的連線 close命令用於關閉連線 傳送操作,put...

用Java實現FTP伺服器

ftp 命令 ftp 的主要操作都是基於各種命令基礎之上的。常用的命令有 設定傳輸模式,它包括asc 文字 和binary 二進位制模式 目錄操作,改變或顯示遠端計算機的當前目錄 cd dir ls 命令 連線操作,open命令用於建立同遠端計算機的連線 close命令用於關閉連線 傳送操作,put...