FTP 的主要操作都是基于各種命令基礎之上的。常用的命令有: · 設置傳輸模式,它包括ASCⅡ(文本) 和BINARY 二進制模式; · 目錄操作,改變或顯示遠程計算機的當前目錄(cd、dir/ls 命令); · 連接操作,open命令用于建立同遠程計算機的連接;close命令用于關閉連接; · 發汪侍仿送操作,put命令用于傳送文件到談旅遠程計算機;mput 命令用于傳送多個文件到遠程計算機; · 獲取操作,get命令用于接收一個文件;mget命令用于接收多個文件。 編程思路 根據FTP 的工作原理,在主函數中建立一個服務器套接字端口,等待客戶端請求困纖,一旦客戶端請求被接受,服務器程序就建立一個服務器分線程,處理客戶端的命令。如果客戶端需要和服務器端進行文件的傳輸,則建立一個新的套接字連接來完成文件的操作。 編程技巧說明
站在用戶的角度思考問題,與客戶深入溝通,找到烏蘭察布網站設計與烏蘭察布網站推廣的解決方案,憑借多年的經驗,讓設計與互聯網技術結合,創造個性化、用戶體驗好的作品,建站類型包括:網站制作、做網站、企業官網、英文網站、手機端網站、網站推廣、國際域名空間、網站空間、企業郵箱。業務覆蓋烏蘭察布地區。
;?? FTP是Internet 上用來傳送文件的協議 在Internet上通過FTP 服務器可以進行文件的上傳(Upload)或下載(Download) FTP是實時聯機服務 在使用它之前必須是具有該服務的一個用戶(用戶名和悶做派口令) 工作時客戶端必須先登錄到作為服務器一方的計算機上 用戶登錄后可以進行文件搜索和文件傳送等有關操作 如改變當前工作目錄 列文件目錄 設置傳輸參數及傳送文件等 使用FTP可以傳送所有類型的文件 如文本文件 二進制可執行文件 圖象文件 聲音文件和數據壓縮文件等 ??? FTP 命令??? FTP 的主要操作都是基于各種命令基礎之上的 常用的命令有 ??? ◆ 設置傳輸模式 它包括ASCⅡ(文本) 和BINARY 二進制模式 ??? ◆ 目錄操作 改變或顯示遠程計算機的當前目錄(螞賀cd dir/ls 命令) ??? ◆ 連接操作 open命令用于建立同遠程計算機的連接 close命令用于關閉連接 ??? ◆ 發送操作 put命令用于傳送文件到遠程計算機 mput 命令用于傳送多個文件到遠程計算機 ??? ◆ 獲取操作 get命令用于接收一個文件 mget命令用于接收多個文件 ??? 編程思路??? 根據FTP的工作原理 在主函數中建立一個服務器套接字端口 等待客戶端請求 一旦客戶端請求被接受 服務器程序就建立一個服務器分線程 處理客戶端的命令 如果客戶端需要和服務器端進行文件的傳輸 則建立一個新的套接字連接來完成文件的操作
編程技巧說明??? 主函數設計??? 在主函數中 完成服務器端口的偵聽和服務線程的創建 我們利用一個靜態字符串變量initDir 來保存服務器線程運行時所在的工作目錄 服務器的初始工作目錄是由程序運行時用戶輸入的 缺省為C盤的根目錄 ??? 具體的代碼如下 ??? public class ftpServer extends Thread{??? private Socket socketClient;??? private int counter;??? private static String initDir;??? public static void main(String[] args){??? if(args length != ) {??? initDir = args[ ];??? }else{ initDir = c: ;}??? int i = ;??? try{??? System out println( ftp server started! ) ??? //監聽 號端口??? ServerSocket s = new ServerSocket( ) ??? for( ){??? //接受客戶端請求??? Socket ining = s accept() ??? //創建服務線程??? new ftpServer(ining i) start() ??? i++;??? }??? }catch(Exception e)胡型{}??? }??? 線程類的設計??? 線程類的主要設計都是在run()方法中實現 用run()方法得到客戶端的套接字信息 根據套接字得到輸入流和輸出流 向客戶端發送歡迎信息 ??? FTP命令的處理??? ( ) 訪問控制命令??? ◆ user name(user) 和 password (pass) 命令處理代碼如下 ??? if(str startsWith( USER )){??? user = str substring( ) ??? user = user trim() ??? out println( Password ) }??? if(str startsWith( PASS ))??? out println( User +user+ logged in ) ??? User 命令和 Password 命令分別用來提交客戶端用戶輸入的用戶名和口令 ??? ◆ CWD (CHANGE WORKING DIRECTORY) 命令處理代碼如下 ??? if(str startsWith( CWD )){??? String str = str substring( ) ??? dir = dir+ / +str trim() ??? out println( CWD mand succesful ) }??? 該命令改變工作目錄到用戶指定的目錄 ??? ◆ CDUP (CHANGE TO PARENT DIRECTORY) 命令處理代碼如下 ??? if(str startsWith( CDUP )){??? int n = dir lastIndexOf( / ) ??? dir = dir substring( n) ??? out println( CWD mand succesful ) }??? 該命令改變當前目錄為上一層目錄 ??? ◆ QUIT命令處理代碼如下 ??? if(str startsWith( QUIT )) {??? out println( GOOD BYE ) ??? done = true;}??? 該命令退出及關閉與服務器的連接 輸出GOOD BYE
( ) 傳輸參數命令??? ◆ Port命令處理代碼如下 ??? if(str startsWith( PORT )) {??? out println( PORT mand successful ) ??? int i = str length() ;??? int j = str lastIndexOf( ) ??? int k = str lastIndexOf( j ) ??? String str str ;str = ;??? str = ;for(int l=k+ ;??? lstr = str + str charAt(l) }??? for(int l=j+ ;l=i;l++){??? str = str + str charAt(l) }??? tempPort = Integer parseInt(str ) * * +Integer parseInt(str ) ??? }??? 使用該命令時 客戶端必須發送客戶端用于接收數據的 位IP 地址和 位 的TCP 端口號 這些信息以 位為一組 使用十進制傳輸 中間用逗號隔開 ??? ◆ TYPE命令處理代碼如下 ??? if(str startsWith( TYPE )){??? out println( type set ) ??? }??? TYPE 命令用來完成類型設置 ??? ( ) FTP 服務命令??? ◆ RETR (RETEIEVE) 和 STORE (STORE)命令處理的代碼 ??? if(str startsWith( RETR )){??? out println( Binary data connection ) ??? str = str substring( ) ??? str = str trim() ??? RandomAccessFile outFile = newRandomAccessFile(dir+ / +str r ) ??? Socket tempSocket = new Socket(host tempPort) ??? OutputStream outSocket= tempSocket getOutputStream() ??? byte byteBuffer[]= new byte[ ];??? int amount;??? try{??? while((amount = outFile read(byteBuffer)) != ){
outSocket write(byteBuffer amount) ??? }??? outSocket close() ??? out println( transfer plete ) ??? outFile close() ??? tempSocket close() }??? catch(IOException e){}??? }??? if(str startsWith( STOR )){??? out println( Binary data connection ) ??? str = str substring( ) ??? str = str trim() ??? RandomAccessFile inFile = newRandomAccessFile(dir+ / +str rw ) ??? Socket tempSocket = new Socket(host tempPort) ??? InputStream inSocket= tempSocket getInputStream() ??? byte byteBuffer[] = new byte[ ];??? int amount;??? try{??? while((amount =inSocket read(byteBuffer) )!= ){??? inFile write(byteBuffer amount) }??? inSocket close() ??? out println( transfer plete ) ??? inFile close() ??? tempSocket close() }??? catch(IOException e)??? {}??? }??? 文件傳輸命令包括從服務器中獲得文件RETR和向服務器中發送文件STOR 這兩個命令的處理非常類似 處理RETR命令時 首先得到用戶要獲得的文件的名稱 根據名稱創建一個文件輸入流 然后和客戶端建立臨時套接字連接 并得到一個輸出流 隨后 將文件輸入流中的數據讀出并借助于套接字輸出流發送到客戶端 傳輸完畢以后 關閉流和臨時套接字 ??? STOR 命令的處理也是同樣的過程 只是方向正好相反 ??? ◆ DELE (DELETE)命令處理代碼如下 ??? if(str startsWith( DELE )){??? str = str substring( ) ??? str = str trim() ??? File file = new File(dir str) ??? boolean del = file delete() ??? out println( delete mand successful ) ??? }??? DELE 命令用于刪除服務器上的指定文件 ??? ◆ LIST命令處理代碼如下 ??? if(str startsWith( LIST )) {??? try{??? out println( ASCII data ) ??? Socket tempSocket = new Socket(host tempPort) ??? PrintWriter out = new PrintWriter(tempSocket getOutputStream() true) ??? File file = new File(dir) ??? String[]??? dirStructure = new String[ ];??? dirStructure= file list() ??? String strType= ;??? for(int i= ;iif( dirStructure[i] indexOf( ) == ) {??? strType = d ;}??? else{??? strType = ;}??? out println(strType+dirStructure[i]) }??? tempSocket close() ??? out println( transfer plete ) }??? catch(IOException e)??? {}??? LIST 命令用于向客戶端返回服務器中工作目錄下的目錄結構 包括文件和目錄的列表 處理這個命令時 先創建一個臨時的套接字向客戶端發送目錄信息 這個套接字的目的端口號缺省為 然后為當前工作目錄創建File 對象 利用該對象的list()方法得到一個包含該目錄下所有文件和子目錄名稱的字符串數組 然后根據名稱中是否含有文件名中特有的 來區別目錄和文件 最后 將得到的名稱數組通過臨時套接字發送到客戶端 lishixinzhi/Article/program/Java/hx/201311/26847
package?com.quantongfu.;
import?java.io.File;
import?java.io.FileInputStream;
import?java.io.IOException;
import?java點虐 .ServerSocket;
import?java.util.List;
import?org.apache點抗 mons點虐 .;
import?org.apache.log4j.Logger;
import?org.apache.log4j點虐 .SocketServer;
import?com.quantongfu.conf.FtpConf;
/**
*?@項目名稱:?telinSyslog
*?@文件名稱:?
*?@創建日期:2015年9月14日?下午3:22:08
*?@功能描述:ftp實體類,用于連接,上傳
*?@修訂記錄:
*/
public?class?Ftp?{
private?static?Logger?logger?=?Logger.getLogger();
private?FTPClient?ftp;
/**
*?
*?@param?path
*????????????上傳到ftp服務器哪個路徑下
*?@param?addr
*????????????地址
*?@param?port
*????????????端口號
*?@param?username
*????????????用戶名
*?@param?password
*????????????密碼
*?@return
*?@throws?Exception
*/
public?boolean?connect()?throws?Exception?{
boolean?result?=?false;
ftp?=?new?FTPClient();
int?reply;
(FtpConf.FTP_HOST,?FtpConf.FTP_PORT);
(FtpConf.FTP_USER_NAME,?FtpConf.FTP_PASSWORD);
;
;
reply?=?;
if?(!FTPReply.isPositiveCompletion(reply))?{
;
return?result;
}
if?(FtpConf.IS_FTP_DIRECTORY)?{
;
}
result?=?true;
return?result;
}
/**
*?
*?@param?files
*?????搜扮攜???????上傳的文件
*?@throws?Exception
*/
public?boolean?upload(File?file)?throws?IOException?世伏{
FileInputStream?input?=?null;
try?{
input?=?new?FileInputStream(file);
boolean?b?=?(file.getName()?+?".tmp",?input);
if?(b)?{
b?=?(file.getName()?+?".tmp",?file.getName());
}
return?b;
}?catch?(Exception?e)?{
e.printStackTrace();
return?false;
}?finally?{
缺族?????if?(input?!=?null)?{
input.close();
}
}
}
/**
*?
*?@param?files
*????????????上傳的文件
*?@throws?Exception
*/
public?boolean?upload(ServerSocket?server,?File?file)?throws?Exception?{
FileInputStream?input?=?null;
try?{
if?(!file.exists())?{
return?true;
}
input?=?new?FileInputStream(file);
boolean?b?=?(server,?file.getName()?+?".tmp",?input);
if?(b)?{
b?=?(file.getName()?+?".tmp",?file.getName());
if?(b)?{
file.delete();
}
}
return?b;
}?catch?(Exception?e)?{
logger.error("ftp?error"?+?e.getMessage());
return?false;
}?finally?{
if?(input?!=?null)?{
try?{
input.close();
}?catch?(IOException?e)?{
e.printStackTrace();
}
}
}
}
/*斷開連接*/
public?void?disConnect()?{
try?{
if?(ftp?!=?null)?{
;
}
}?catch?(IOException?e)?{
e.printStackTrace();
}
}
/*獲取連接*/
public?static?Ftp?getFtp()?{
Ftp?ftp?=?new?Ftp();
try?{
;
}?catch?(Exception?e)?{
logger.error("FTP連接異常"?+?e.getMessage());
e.printStackTrace();
}
return?ftp;
}
/*重連*/
public?Ftp?reconnect()?{
disConnect();
return?getFtp();
}
}
使用Apache FtpClient jar包,獲取jar :
參考
client = new FTPSClient(implictSSL);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
kmf.init(KeyStore.getInstance("BKS"), "wshr.ut".toCharArray());
client.setTrustManager(new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() { return null; }
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { }
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { }
});
client.setKeyManager(kmf.getKeyManagers()[0]);
client.setNeedClientAuth(false);
client.setUseClientMode(false);
分享標題:java操作ftp的代碼 java編寫ftp服務器
分享地址:http://m.newbst.com/article30/ddpohpo.html
成都網站建設公司_創新互聯,為您提供自適應網站、關鍵詞優化、網站內鏈、軟件開發、域名注冊、服務器托管
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯