ftp客戶端代碼
1. 求簡單的ftp伺服器客戶端代碼(不要太難,追加100分)
http://j-ftp.sourceforge.net/
點download
再點這個句子"Download the latest jftp.jar. " 里的 jftp.jar 就是源代碼
2. 主動模式(port)的ftp客戶端c/c++代碼示例
在linux環境下執行
#gcc ftp.c -o ftp
#./ftp
#ftp->login //登錄
connect success,pelase enter username
#ftp-> //後面自己按照提示(name支持匿名登錄,即輸入anonymous)
3. C#FTP客戶端設計
伺服器的ip,解析
Dns類里有
匿名的時候用戶名和密碼不能輸入,就把那兩個文本框的Enable設置為false,有ReadOnly也可以設置為true
參考
https://ftplib.codeplex.com/
4. 怎麼用java開發FTP客戶端
摘要
本文解釋了如何利用庫用Java語言編寫FTP客戶端代碼。它比較了FTP庫的一個完全列表,演示了每個庫的優點和缺點,並且幫助決策者為他們的需要選擇適當的庫。另外,本文闡述了Fa?ade模式如何在取代一個庫時改變管理。最後,作者Jean-Pierre Norguet討論並解決了由於缺乏權威性的說明書引起的一些問題。
讓我們假設一個情景:我們要編寫一個純Java應用程序,該程序必須從運行FTP伺服器的遠程計算機上下載文件。我們也通過遠程文件信息,像名字、日期、或者尺寸,來過濾下載。
自己來寫一個FTP協議處理,盡管是有可能,並且可能很有趣。但是這樣做也有可能有困難、花費長時間、並且有潛在的風險。既然我們不肯花費時間、精力、或者金錢自己來寫一個處理器,那我們推薦使用一個可重用的現有的軟體組件。萬維網上有並且大量的庫可供使用。有了一個FTP客戶端庫,下載一個文件用Java語言編寫就像下面一樣簡單:
FTPClient ftpClient = new FTPClient();
ftpClient.connect("ftp.foo.com", "user01", "pass1234");
ftpClient.download("C:\\Temp\\", "README.txt");
// Eventually other operations here ...
ftpClient.disconnect();
尋找一個適合我們需要的高質量的Java FTP客戶端庫並不像他看起來那麼簡單;它可能相當困難。要找到一個Java FTP客戶端庫需要花一些時間。接著,在我們找到所有的已存在的庫之後,我們選哪個?每個庫適合不同的需要。庫在質量上是不等的,並且它們的設計有本質的區別。每個提供一套不同的屬性和使用不同類型的行話來描述他們。
因此,計算和比較FTP客戶端庫證明是困難而且令人迷惑的。重復使用已存在的組件是一個值得推薦的過程,但在這個例子中,啟動它也是令人沮喪的。並且這有點羞愧:在選好的一個好的FTP庫之後,剩下的工作就是常式了。
本文旨在使選擇過程簡短、容易、並且有價值。我首先列出了所有的FTP客戶端庫。接著,我定義和描述了庫應該用某種方式找到的相關標準的一個表格。最後,我列出了一個總瀏覽的矩陣,該矩陣給出了庫間相互比較的過程的快速瀏覽。所有的信息提供了我們作出一個迅速、可靠、和長期的決定所需的每件事。
使用JDK(Java 開發工具集)的FTP支持
用於FTP的訪問規范是用於注釋的請求:959(RFC959)。Sun Microsystems提供了JDK的一個RFC959執行。但是它是內部的、非文檔化的、並且不提供任何資源。當RFC959在尚未公開時,它實際上是執行RFC1738、URL規范的一個公共界面的後終端。如圖1。
圖1. 使用JDK的FTP支持。
RFC1738的一個執行過程在JDK中作為標准給出。它為基本的FTP傳送做一個可推理的工作。它是公共的、文檔化的、並且提供源代碼。要使用它,我們可編寫下面語句:
URL url = new URL("ftp://user01:[email protected]/README.txt;type=i");
URLConnection urlc = url.openConnection();
InputStream is = urlc.getInputStream(); // To download
OutputStream os = urlc.getOutputStream(); // To upload
使用JDK的FTP客戶端嚴格的遵守標准推薦,但它有以下幾個說明:
它從根本上區別於第三方的FTP客戶端庫;這些執行RFC959而不是RFC1738
RFC959用大多數的桌面FTP客戶端工具執行。許多Java程序員使用這些工具連接到FTP伺服器上。作為一個嘗試,這些工具及有可能優先於類似的RFC959庫。
URL 和URLConnection類只開放用於通訊的流。Sun庫不為構造原始的FTP伺服器響應成為像String、 File、 RemoteFile、 或者 Calendar之類的更合用的Java對象而提供直接支持。所以我們不得不編寫更多的代碼,只是為了把數據寫入一個文件中或者開始一個目錄列表。
正像RFC1738的3.2部分解釋的一樣,"最優化",FTP URL在每個操作後要求關閉(控制)連接。這對於傳送許多小文件是一種浪費、並且毫無效率。而且,作了特別限制FTP伺服器可能把會這樣一個通訊開銷認為一個是惡毒的網路攻擊或者濫用而拒絕提供進一步的服務。
最後,它缺乏幾個有用的屬性。
由於以上所有或者某種原因,可優先使用一個第三方的庫。下面部分列出了可供選擇的第三方的庫。
見:http://www.javaworld.com/javaworld/jw-04-2003/ftp/jw-0404-ftptable.html
5. linux下ftp客戶端源碼
sudo apt-get source $packagename
$packagename 換成ftp客戶端名字,如lftp,我猜lftp是最簡單的。
其他常見的有
kftpgrabber
KDE下ftp客戶端,支持編碼選擇。對中文支持較好
gftp
gnome下ftp客戶端,目前對中文支持尚不太好,受抱怨頗多。
fireftp
firefox的ftp客戶端插件,新版對中文支持較好。
FileZilla
對中文支持較好
CrossFTP
基於Java的穩定ftp客戶端和同步工具。優良的中文/Unicode支持。
6. 如何用java實現ftp客戶端程序
FTP 的主要操作都是基於各種命令基礎之上的。常用的命令有: · 設置傳輸模式,它包括ASCⅡ(文本) 和BINARY 二進制模式; · 目錄操作,改變或顯示遠程計算機的當前目錄(cd、dir/ls 命令); · 連接操作,open命令用於建立同遠程計算機的連接;close命令用於關閉連接; · 發送操作,put命令用於傳送文件到遠程計算機;mput 命令用於傳送多個文件到遠程計算機; · 獲取操作,get命令用於接收一個文件;mget命令用於接收多個文件。 編程思路 根據FTP 的工作原理,在主函數中建立一個伺服器套接字埠,等待客戶端請求,一旦客戶端請求被接受,伺服器程序就建立一個伺服器分線程,處理客戶端的命令。如果客戶端需要和伺服器端進行文件的傳輸,則建立一個新的套接字連接來完成文件的操作。 編程技巧說明 http://www.jacken.com.cn/Programming/Java/2008-10-24/Java-.html
7. 如何在Linux中部署ftp服務只需要代碼
Linux下ftp服務可以通過搭建vsftpd服務來實現,以CentOS為例,首先查看系統中是否安裝了vsftpd,可以通過執行命令 rpm -qa | grep vsftpd 來查看是否安裝相應的包,如果沒有安裝那麼可以執行 yum -y install vsftpd 來安裝,安裝之後首先創建ftp用戶,比如ftp_test,命令如下:useradd -s /sbin/nologin -d /home/ftp_test ftp_test
目錄盡量不要選擇根目錄下,這里是/home/ftp_test,並且ftp_test這個目錄不要手動創建,否則許可權會有問題,執行命令的時候會自動創建,
可以看到許可權現在是對於ftp_test用戶是可讀可寫可執行的,其他用戶和組下面的都沒有任何許可權,現在為ftp_test用戶創建密碼:passwd ftp_test
執行之後輸入2次密碼確認就設置好了密碼
然後編輯vsftpd配置文件,位置是:vim /etc/vsftpd/vsftpd.conf
找到anonymous_enable這個配置項,默認是YES,修改成NO,表示不允許匿名用戶登錄
現在直接保存配置文件,執行 systemctl start vsftpd.service 啟動vsftp服務,然後可以通過命令: systemctl status vsftpd.service 查看ftp服務的運行狀態,現在就可以用ftp客戶端進行連接了,這里用FileZilla測試,連接正常
現在基本的ftp服務就部署完了,客戶端可以正常上傳,下載,修改文件;但是這樣有個問題就是所有的目錄都暴露給客戶端了,雖然客戶端不能隨意修改刪除其餘的文件,但是因為目錄可見,所以總會有一些風險,所以接下來還需要配置讓ftp用戶只在自己的家目錄下面活動,而無法查看其它任何目錄,同樣是打開配置文件/etc/vsftpd/vsftpd.conf,找到chroot_local_user=YES這個配置,默認是注釋的,這里去掉注釋,表示只讓用戶在自己的目錄裡面活動,如果只是保存這一個配置的話,用ftp連接客戶端會返回500
OOPS: ftp chaodiquan.com /vsftpd: refusing to run with writable root inside
chroot()的錯誤,即禁止運行在可寫的家目錄中,因為剛才ftp_test這個目錄有w許可權,而現在我們使用的vsftpd版本是3.0.2
屬於比較新的版本,為了安全性做了一些限制,如果你此時想通過 chmod a-w /home/ftp_test 來去掉目錄的寫許可權,那麼連接成功是沒問題的,但是無法上傳文件了,所以網上很多說修改許可權的方法是不可取的,正確的做法是應該在下面添加一行配置allow_writeable_chroot=YES表示允許對家目錄的寫許可權,
配置完這兩項以後保存退出,然後執行 systemctl restart vsftpd.service 重啟vsftpd服務,現在重新使用ftp連接就成功了,並且任何操作也是沒問題的
現在可以看到上面的路徑是一個/,對於ftp用戶來說也就是根目錄了,只能在這個目錄下操作,而無法跳出這個目錄
以上就是vsftpd服務的基本搭建過程,實際使用時可以分配多個用戶
8. 怎樣用java開發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.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import zn.ccfccb.util.CCFCCBUtil;
import zn.ccfccb.util.ZipUtilAll;
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);
}
}
}
}
// 調用樣例:
public static void main(String[] args) {
try {
// 密鑰/res/20150228
// ZipUtilAll.unZip(new File(("D:/123/123.zip")), "D:/123/");
// ZipDemo1232.unZip(new File(("D:/123/123.zip")), "D:/123/");
// 明文文件路徑
String plainFilePath = "D:/req_20150204_0011.txt";
// 密文文件路徑
String secretFilePath = "req_20150204_00134.txt";
// 加密
// encodeAESFile(key, plainFilePath, secretFilePath);
fileDownloadByFtp("D://123.zip","123.zip","req/20150228");
ZipUtilAll.unZip("D://123.zip", "D:/123/李筱/");
// 解密
plainFilePath = "D:/123.sql";
// secretFilePath = "D:/test11111.sql";
// decodeAESFile(key, plainFilePath, secretFilePath);
} catch (Exception e) {
e.printStackTrace();
}
}
}
9. 能否給一個java開發的具有圖形界面的ftp伺服器客戶端源代碼呢
/ **
*創建日期:2008年12月23日
*類名:Ftp.java
*類路徑:組織結構
*更改日誌:
* / 包組織結構;
進口的java.io.File;
進口java.io.FileInputStream中;
進口java.io.FileOutputStream中;
進口的java。 io.IOException;
進口sun.net.TelnetInputStream;
進口sun.net.TelnetOutputStream;
進口sun.net.ftp.FtpClient;
> / **
* @作者南山地獄
* @說明FTP操作
* /
公共類的Ftp {
/ **
* BR />獲取FTP目錄* / 公共無效getftpList(){
字元串伺服器=「IP地址 /輸入FTP伺服器/>弦樂用戶=」「;/ / FTP伺服器的登錄用戶名
字元串密碼=「」;/ /登錄FTP伺服器的用戶名
字元串路徑密碼=「」;/ / FTP路徑上的伺服器
嘗試{
> FtpClient的FTP客戶端=新FtpClient的();/ /創建FtpClient的對象
ftpClient.openServer(伺服器);/ /連接到FTP伺服器
ftpClient.login(用戶名,密碼);/ / FTP伺服器 BR />如果(path.length()= 0){
ftpClient.cd(路徑);
}
TelnetInputStream是= ftpClient.list();
詮釋三;
而{
System.out.print((char)的C)((C = is.read())= -1!);
}
掉} is.close ();
ftpClient.closeServer();/ /退出FTP伺服器
}趕上(IOException異常前){
System.out.println(ex.getMessage());
}
}
/ **
*
* /
公共無效getFtpFile(){
字元串伺服器=「」;/ / IP地址中輸入FTP伺服器
弦樂用戶=「」;/ / FTP伺服器的登錄用戶名
字元串密碼=「」;/ /登錄密碼為FTP伺服器的用戶名
字元串路徑=「路徑
字元串文件名「;/ /上=的FTP伺服器」「;/ /下載文件名稱
嘗試{
FtpClient的FTP客戶端=新FtpClient的();
ftpClient.openServer(伺服器);
ftpClient.login(用戶名,密碼);
如果(路徑。長度()= 0)
ftpClient.cd(路徑);!
ftpClient.binary();
TelnetInputStream是= ftpClient.get(文件名);
文件file_out =新的文件(文件名);
文件輸出流OS =新的文件輸出流(file_out);
位元組[]位元組=新位元組[1024];
詮釋三;
而((C = is.read(位元組))= -1){
os.write (位元組,0,C);
}!
掉} is.close();
os.close();
ftpClient.closeServer();
}趕上(IOException異常前){
System.out.println (ex.getMessage());
}
FTP}
/ **
*文件上傳到FTP
* /
公共無效putFtpFile() {
字元串伺服器=「」;/ /輸入IP地址對伺服器
字元串用戶的地址=「」;/ / FTP伺服器的登錄用戶名
字元串密碼=「」;/ / FTP伺服器登錄用戶名密碼
字元串路徑=「」就 / FTP伺服器/>字元串文件名=「」;/ /上傳的文件名
FtpClient的FTP客戶端=新的try { FtpClient的();
ftpClient.openServer(伺服器);
ftpClient.login(用戶名,密碼);
如果(!path.length()= 0)
ftpClient.cd (路徑);
ftpClient.binary();
TelnetOutputStream OS = ftpClient.put(文件名);
文件file_in =新的文件(文件名);
文件輸入流是=新的文件輸入流(file_in);
位元組[]位元組=新位元組[1024];
詮釋三;
同時(! (C = is.read(位元組))= -1){
操作系統。寫(位元組,0,C);
}
掉} is.close();
os.close();
ftpClient.closeServer();
}趕上(IOException異常前){
System.out.println(ex.getMessage());
}
}
}