本文目錄一覽:
- 1、如何用JAVA實現FTP訪問
- 2、如何用java連接到ftp上
- 3、java 實現ftp上傳如何創建文件夾?
- 4、java中怎麼實現ftp文件傳輸
- 5、java中怎麼實現ftp伺服器
- 6、java實現ftp的幾種方式
如何用JAVA實現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 != 0) {
initDir = args[0];
}else{ initDir = “c:”;}
int i = 1;
try{
System.out.println(“ftp server started!”);
//監聽21號埠
ServerSocket s = new ServerSocket(21);
for(;;){
//接受客戶端請求
Socket incoming = s.accept();
//創建服務線程
new ftpServer(incoming,i).start();
i++;
}
}catch(Exception e){}
}
如何用java連接到ftp上
現在已經封裝好了的方法,不需要任何其他知識即可連接的。只需要知道ftp登錄用戶名、密碼、埠、存儲路徑即可。
package zn.ccfccb.util;
import hkrt.b2b.view.util.Log;
import hkrt.b2b.view.util.ViewUtil;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.commons.net.;
import org.apache.commons.net.;
public class CCFCCBFTP {
/**
* 上傳文件
*
* @param fileName
* @param plainFilePath 明文文件路徑路徑
* @param filepath
* @return
* @throws Exception
*/
public static String fileUploadByFtp(String plainFilePath, String fileName, String filepath) throws Exception {
FileInputStream fis = null;
ByteArrayOutputStream bos = null;
FTPClient ftpClient = new FTPClient();
String bl = “false”;
try {
fis = new FileInputStream(plainFilePath);
bos = new ByteArrayOutputStream(fis.available());
byte[] buffer = new byte[1024];
int count = 0;
while ((count = fis.read(buffer)) != -1) {
bos.write(buffer, 0, count);
}
bos.flush();
Log.info(“加密上傳文件開始”);
Log.info(“連接遠程上傳伺服器”+CCFCCBUtil.CCFCCBHOSTNAME+”:”+22);
ftpClient.connect(CCFCCBUtil.CCFCCBHOSTNAME, 22);
ftpClient.login(CCFCCBUtil.CCFCCBLOGINNAME, CCFCCBUtil.CCFCCBLOGINPASSWORD);
// Log.info(“連接遠程上傳伺服器”+”192.168.54.106:”+2021);
// ftpClient.connect(“192.168.54.106”, 2021);
// ftpClient.login(“hkrt-CCFCCBHK”, “3OLJheziiKnkVcu7Sigz”);
FTPFile[] fs;
fs = ftpClient.listFiles();
for (FTPFile ff : fs) {
if (ff.getName().equals(filepath)) {
bl=”true”;
ftpClient.changeWorkingDirectory(“/”+filepath+””);
}
}
Log.info(“檢查文件路徑是否存在:/”+filepath);
if(“false”.equals(bl)){
ViewUtil.dataSEErrorPerformedCommon( “查詢文件路徑不存在:”+”/”+filepath);
return bl;
}
ftpClient.setBufferSize(1024);
ftpClient.setControlEncoding(“GBK”);
// 設置文件類型(二進位)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.storeFile(fileName, fis);
Log.info(“上傳文件成功:”+fileName+”。文件保存路徑:”+”/”+filepath+”/”);
return bl;
} catch (Exception e) {
throw e;
} finally {
if (fis != null) {
try {
fis.close();
} catch (Exception e) {
Log.info(e.getLocalizedMessage(), e);
}
}
if (bos != null) {
try {
bos.close();
} catch (Exception e) {
Log.info(e.getLocalizedMessage(), e);
}
}
}
}
/**
*下載並解壓文件
*
* @param localFilePath
* @param fileName
* @param routeFilepath
* @return
* @throws Exception
*/
public static String fileDownloadByFtp(String localFilePath, String fileName,String routeFilepath) throws Exception {
FileInputStream fis = null;
ByteArrayOutputStream bos = null;
FileOutputStream fos = null;
FTPClient ftpClient = new FTPClient();
String SFP = System.getProperty(“file.separator”);
String bl = “false”;
try {
Log.info(“下載並解密文件開始”);
Log.info(“連接遠程下載伺服器”+CCFCCBUtil.CCFCCBHOSTNAME+”:”+22);
ftpClient.connect(CCFCCBUtil.CCFCCBHOSTNAME, 22);
ftpClient.login(CCFCCBUtil.CCFCCBLOGINNAME, CCFCCBUtil.CCFCCBLOGINPASSWORD);
// ftpClient.connect(CMBCUtil.CMBCHOSTNAME, 2021);
// ftpClient.login(CMBCUtil.CMBCLOGINNAME, CMBCUtil.CMBCLOGINPASSWORD);
FTPFile[] fs;
ftpClient.makeDirectory(routeFilepath);
ftpClient.changeWorkingDirectory(routeFilepath);
bl = “false”;
fs = ftpClient.listFiles();
for (FTPFile ff : fs) {
if (ff.getName().equals(fileName)) {
bl = “true”;
Log.info(“下載文件開始。”);
ftpClient.setBufferSize(1024);
// 設置文件類型(二進位)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
InputStream is = ftpClient.retrieveFileStream(fileName);
bos = new ByteArrayOutputStream(is.available());
byte[] buffer = new byte[1024];
int count = 0;
while ((count = is.read(buffer)) != -1) {
bos.write(buffer, 0, count);
}
bos.flush();
fos = new FileOutputStream(localFilePath+SFP+fileName);
fos.write(bos.toByteArray());
Log.info(“下載文件結束:”+localFilePath);
}
}
Log.info(“檢查文件是否存:”+fileName+” “+bl);
if(“false”.equals(bl)){
ViewUtil.dataSEErrorPerformedCommon(“查詢無結果,請稍後再查詢。”);
return bl;
}
return bl;
} catch (Exception e) {
throw e;
} finally {
if (fis != null) {
try {
fis.close();
} catch (Exception e) {
Log.info(e.getLocalizedMessage(), e);
}
}
if (bos != null) {
try {
bos.close();
} catch (Exception e) {
Log.info(e.getLocalizedMessage(), e);
}
}
if (fos != null) {
try {
fos.close();
} catch (Exception e) {
Log.info(e.getLocalizedMessage(), e);
}
java 實現ftp上傳如何創建文件夾?
準備條件:java實現ftp上傳用到了commons-net-3.3.jar包
首先建立ftphost連接
public boolean connect(String path, String addr, int port, String username, String password) {
try {
//FTPClient ftp = new FTPHTTPClient(addr, port, username, password);
ftp = new FTPClient();
int reply;
;
System.out.println(“連接到:” + addr + “:” + port);
System.out.print();
reply = ;
if (!FTPReply.isPositiveCompletion(reply)) {
;
System.err.println(“FTP目標伺服器積極拒絕.”);
System.exit(1);
return false;
}else{
(username, password);
;
;
;
System.out.println(“已連接:” + addr + “:” + port);
return true;
}
} catch (Exception ex) {
ex.printStackTrace();
System.out.println(ex.getMessage());
return false;
}
}
然後再利用ftpclient的makeDirectory方法創建文件夾
public void createDir(String dirname){
try{
;
System.out.println(“在目標伺服器上成功建立了文件夾: ” + dirname);
}catch(Exception ex){
System.out.println(ex.getMessage());
}
}
斷開host連接
public void disconnect(){
try {
;
} catch (IOException e) {
e.printStackTrace();
}
}
最後是程序的調用方法
public static void main(String[] args) {
FtpUploadTest ftpupload = new FtpUploadTest();
if(ftpupload.connect(“”, “172.39.8.x”, 20, “administrator”, “abc@123”)){
ftpupload.createDir(“/UPLOAD”);
ftpupload.disconnect();
}
}
java中怎麼實現ftp文件傳輸
package com.quantongfu.;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.util.List;
import org.apache.commons.net.;
import org.apache.log4j.Logger;
import org.apache.log4j.net.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 :
java中怎麼實現ftp伺服器
學習了計算機網路之後,利用java寫了一個ftp伺服器。
一、實現的ftp命令
實現了基本的user,pass,list,port,quit,retr,cwd,stor等命令
二、以上命令所對應的功能
對應的功能是:下載,上傳,獲取伺服器目錄,切換目錄等
三、用於測試的ftp客戶端:windows自帶的ftp客戶端
四、實現的思想
1、使用ServerSocket進行監聽,每個控制連接的請求到來之後,開啟一個線程進行處理(這裡使用的java bio,效率較差,對於控制連接最好使用NIO處理,之後會再寫個
nio的實現)
2、 對於命令使用工廠方法模式進行設計,當需要添加新的命令的時候,只需要添加一個新的命令類,實現相應介面,修改工廠產生邏輯,而不用修改其他的程序代碼。可
擴展性較好,同時符合開閉原則。
五、實現過程中碰到的問題
1、對於tcp與socket的關係理解錯誤,以為所有的數據的輸入都是要經過serverSocket().accept()方法。其實,ServerSocket.accept()所對應的是tcp裡面的三次握手建
立連接的階段,之後的tcp的連接由客戶端和伺服器端的一對socket來維護,是屬於establish階段,在這個階段,通信是全雙工的,任何一方都能夠發送數據。
socket.close()對應的階段是斷開連接(四次揮手)的階段。
2、剛開始對於ftp協議不是很理解,不知道他的工作方式是怎樣的,後來在看了tcp協議卷裡面的ftp的內容之後,才知道ftp命令和應答碼是關鍵。eg:剛開始測試時,在
輸入用戶名之後,不會提示輸入密碼的。原因:沒有返回對應的應答碼:331. 另外要注意的是:返回的數據要以換行回車作為結束–\r\n.
六、代碼列表
簡單說明:
ftpServer:是伺服器的主程序,入口,同時負責監聽本地的21號埠。
ControllerThread.java:用於處理控制連接的線程(每一個控制連接請求對應一個線程)ps:實在很浪費(流量小,連接多)。
Share:一些全局性數據的維護。
Command:是命令介面,定義了一個所有命令都要實現的方法。
CommandFactory:命令工廠,通過傳人的參數,決定生成的命令對象。
UserCommand,PortCommand等:是具體ftp命令的實現
java實現ftp的幾種方式
有二個種FTP方式:ftp和sftp
ftp的包:commons-net-3.3.jar
sftp包:com.jcraft.jsch_0.1.31.jar
原創文章,作者:YHMW,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/139937.html