學(xué)習(xí)了計(jì)算機(jī)網(wǎng)絡(luò)之后,利用java寫了一個(gè)ftp服務(wù)器。
創(chuàng)新互聯(lián)主營新樂網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,APP應(yīng)用開發(fā),新樂h5重慶小程序開發(fā)搭建,新樂網(wǎng)站營銷推廣歡迎新樂等地區(qū)企業(yè)咨詢
一、實(shí)現(xiàn)的ftp命令
實(shí)現(xiàn)了基本的user,pass,list,port,quit,retr,cwd,stor等命令
二、以上命令所對(duì)應(yīng)的功能
對(duì)應(yīng)的功能是:下載,上傳,獲取服務(wù)器目錄,切換目錄等
三、用于測試的ftp客戶端:windows自帶的ftp客戶端
四、實(shí)現(xiàn)的思想
1、使用ServerSocket進(jìn)行監(jiān)聽,每個(gè)控制連接的請(qǐng)求到來之后,開啟一個(gè)線程進(jìn)行處理(這里使用的java bio,效率較差,對(duì)于控制連接最好使用NIO處理,之后會(huì)再寫個(gè)
nio的實(shí)現(xiàn))
2、 對(duì)于命令使用工廠方法模式進(jìn)行設(shè)計(jì),當(dāng)需要添加新的命令的時(shí)候,只需要添加一個(gè)新的命令類,實(shí)現(xiàn)相應(yīng)接口,修改工廠產(chǎn)生邏輯,而不用修改其他的程序代碼。可
擴(kuò)展性較好,同時(shí)符合開閉原則。
五、實(shí)現(xiàn)過程中碰到的問題
1、對(duì)于tcp與socket的關(guān)系理解錯(cuò)誤,以為所有的數(shù)據(jù)的輸入都是要經(jīng)過serverSocket().accept()方法。其實(shí),ServerSocket.accept()所對(duì)應(yīng)的是tcp里面的三次握手建
立連接的階段,之后的tcp的連接由客戶端和服務(wù)器端的一對(duì)socket來維護(hù),是屬于establish階段,在這個(gè)階段,通信是全雙工的,任何一方都能夠發(fā)送數(shù)據(jù)。
socket.close()對(duì)應(yīng)的階段是斷開連接(四次揮手)的階段。
2、剛開始對(duì)于ftp協(xié)議不是很理解,不知道他的工作方式是怎樣的,后來在看了tcp協(xié)議卷里面的ftp的內(nèi)容之后,才知道ftp命令和應(yīng)答碼是關(guān)鍵。eg:剛開始測試時(shí),在
輸入用戶名之后,不會(huì)提示輸入密碼的。原因:沒有返回對(duì)應(yīng)的應(yīng)答碼:331. 另外要注意的是:返回的數(shù)據(jù)要以換行回車作為結(jié)束--\r\n.
六、代碼列表
簡單說明:
ftpServer:是服務(wù)器的主程序,入口,同時(shí)負(fù)責(zé)監(jiān)聽本地的21號(hào)端口。
ControllerThread.java:用于處理控制連接的線程(每一個(gè)控制連接請(qǐng)求對(duì)應(yīng)一個(gè)線程)ps:實(shí)在很浪費(fèi)(流量小,連接多)。
Share:一些全局性數(shù)據(jù)的維護(hù)。
Command:是命令接口,定義了一個(gè)所有命令都要實(shí)現(xiàn)的方法。
CommandFactory:命令工廠,通過傳人的參數(shù),決定生成的命令對(duì)象。
UserCommand,PortCommand等:是具體ftp命令的實(shí)現(xiàn)
FTP 的主要操作都是基于各種命令基礎(chǔ)之上的。常用的命令有: · 設(shè)置傳輸模式,它包括ASCⅡ(文本) 和BINARY 二進(jìn)制模式; · 目錄操作,改變或顯示遠(yuǎn)程計(jì)算機(jī)的當(dāng)前目錄(cd、dir/ls 命令); · 連接操作,open命令用于建立同遠(yuǎn)程計(jì)算機(jī)的連接;close命令用于關(guān)閉連接; · 發(fā)送操作,put命令用于傳送文件到遠(yuǎn)程計(jì)算機(jī);mput 命令用于傳送多個(gè)文件到遠(yuǎn)程計(jì)算機(jī); · 獲取操作,get命令用于接收一個(gè)文件;mget命令用于接收多個(gè)文件。 編程思路 根據(jù)FTP 的工作原理,在主函數(shù)中建立一個(gè)服務(wù)器套接字端口,等待客戶端請(qǐng)求,一旦客戶端請(qǐng)求被接受,服務(wù)器程序就建立一個(gè)服務(wù)器分線程,處理客戶端的命令。如果客戶端需要和服務(wù)器端進(jìn)行文件的傳輸,則建立一個(gè)新的套接字連接來完成文件的操作。 編程技巧說明
在主函數(shù)中,完成服務(wù)器端口的偵聽和服務(wù)線程的創(chuàng)建。我們利用一個(gè)靜態(tài)字符串變量initDir 來保存服務(wù)器線程運(yùn)行時(shí)所在的工作目錄。服務(wù)器的初始工作目錄是由程序運(yùn)行時(shí)用戶輸入的,缺省為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 != 0) {
initDir = args[0];
}else{ initDir = "c:";}
int i = 1;
try{
System.out.println("ftp server started!");
//監(jiān)聽21號(hào)端口
ServerSocket s = new ServerSocket(21);
for(;;){
//接受客戶端請(qǐng)求
Socket incoming = s.accept();
//創(chuàng)建服務(wù)線程
new ftpServer(incoming,i).start();
i++;
}
}catch(Exception e){}
}
import java.io.File;
import java.io.FileInputStream;
import org.apache.commons.net.;
import org.apache.commons.net.;
public class test {
private FTPClient ftp;
/**
*
* @param path 上傳到ftp服務(wù)器哪個(gè)路徑下
* @param addr 地址
* @param port 端口號(hào)
* @param username 用戶名
* @param password 密碼
* @return
* @throws Exception
*/
private boolean connect(String path,String addr,int port,String username,String password) throws Exception {
boolean result = false;
ftp = new FTPClient();
int reply;
;
;
;
reply = ;
if (!FTPReply.isPositiveCompletion(reply)) {
;
return result;
}
;
result = true;
return result;
}
/**
*
* @param file 上傳的文件或文件夾
* @throws Exception
*/
private void upload(File file) throws Exception{
if(file.isDirectory()){
(file.getName());
(file.getName());
String[] files = file.list();
for (int i = 0; i files.length; i++) {
File file1 = new File(file.getPath()+"\\"+files[i] );
if(file1.isDirectory()){
upload(file1);
;
}else{
File file2 = new File(file.getPath()+"\\"+files[i]);
分享名稱:java用ftp代碼 java操作ftp上的文件
標(biāo)題URL:http://muchs.cn/article30/dohojso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站制作、自適應(yīng)網(wǎng)站、手機(jī)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)