Ⅰ java遠程進行telnet ftp ssh連接的方法
文件傳輸協議(File Transfer Protocol, FTP)FTP是用於在網路上進行文件傳輸的一套標准協議。 它屬於網路協議組的應用層。 FTP是一個8位的客戶端-伺服器協議, 能操作任何類型的文件而不需要進一步處理, 就像MIME或Unencode一樣。但是, FTP有著極高的延時,這意味著, 從開始請求到第一次接收需求數據之間的時間會非常長, 並且不時的必需執行一些冗長的登陸進程。 概述 FTP服務一般運行在20和21兩個埠。 埠20用於在客戶端和伺服器之間傳輸數據流, 而埠21用於傳輸控制流,並且是命令通向ftp伺服器的進口。 當數據通過數據流傳輸時,控制流處於空閑狀態。 而當控制流空閑很長時間後,客戶端的防火牆會將其會話置為超時, 這樣當大量數據通過防火牆時,會產生一些問題。此時, 雖然文件可以成功的傳輸,但因為控制會話會被防火牆斷開, 傳輸會產生一些錯誤。 FTP實現的目標: 促進文件的共享(計算機程序或數據) 鼓勵間接或者隱式的使用遠程計算機 向用戶屏蔽不同主機中各種文件存儲系統的細節 可靠和高效的傳輸數據 缺點: 密碼和文件內容都使用明文傳輸,可能產生不希望發生的竊聽。 因為必需開放一個隨機的埠以建立連接,當防火牆存在時, 客戶端很難過濾處於主動模式下的FTP流量。 這個問題通過使用被動模式的FTP得到了很大解決。 伺服器可能會被告知連接一個第三方計算機的保留埠。 FTP雖然可以被終端用戶直接使用, 但是它是設計成被FTP客戶端程序所控制。 運行FTP服務的許多站點都開放匿名服務,在這種設置下, 用戶不需要帳號就可以登錄伺服器,默認情況下, 匿名用戶的用戶名是:「anonymous」。 這個帳號不需要密碼, 雖然通常要求輸入用戶的郵件地址作為認證密碼, 但這只是一些細節或者此郵件地址根本不被確定, 而是依賴於FTP伺服器的配置情況。 [編輯] 主動和被動模式 FTP有兩種使用模式:主動和被動。 主動模式要求客戶端和伺服器端同時打開並且監聽一個埠以建立連 接。在這種情況下,客戶端由於安裝了防火牆會產生一些問題。 所以,創立了被動模式。 被動模式只要求伺服器端產生一個監聽相應埠的進程, 這樣就可以繞過客戶端安裝了防火牆的問題。 一個主動模式的FTP連接建立要遵循以下步驟: 客戶端打開一個隨機的埠(埠號大於1024,在這里, 我們稱它為x), 同時一個FTP進程連接至伺服器的21號命令埠。此時, 源埠為隨機埠x,在客戶端,遠程埠為21,在伺服器。 客戶端開始監聽埠(x+1),同時向伺服器發送一個埠命令( 通過伺服器的21號命令埠), 此命令告訴伺服器客戶端正在監聽的埠號並且已准備好從此埠接 收數據。這個埠就是我們所知的數據埠。 伺服器打開20號源埠並且建立和客戶端數據埠的連接。此時, 源埠為20,遠程數據埠為(x+1)。 客戶端通過本地的數據埠建立一個和伺服器20號埠的連接, 然後向伺服器發送一個應答,告訴伺服器它已經建立好了一個連接。 [編輯] FTP和網頁瀏覽器 大多數最新的網頁瀏覽器和文件管理器都能和FTP伺服器建立連接 。這使得在FTP上通過一個介面就可以操控遠程文件, 如同操控本地文件一樣。 這個功能通過給定一個FTP的URL實現,形如ftp://< 伺服器地址>(例如, ftp://ftp.gimp.org )。是否提供密碼是可選擇的,如果有密碼,則形如ftp://< login>:<password>@< ftpserveraddress>。 大部分網頁瀏覽器要求使用被動FTP模式, 然而並不是所有的FTP伺服器都支持被動模式。
Ⅱ java 有什麼命令能夠判斷ftp服務的連接方式是主動連接還是被動連接
一.FTP的PORT(主動模式)和PASV(被動模式)
1. PORT(主動模式)
PORT中文稱為主動模式,工作的原理: FTP客戶端連接到FTP伺服器的21埠,發送用戶名和密碼登錄,登錄成功後要list列表或者讀取數據時,客戶端隨機開放一個埠(1024以上),發送 PORT命令到FTP伺服器,告訴伺服器客戶端採用主動模式並開放埠;FTP伺服器收到PORT主動模式命令和埠號後,通過伺服器的20埠和客戶端開放的埠連接,發送數據.
2. PASV(被動模式)
PASV是Passive的縮寫,中文成為被動模式,工作原理:FTP客戶端連接到FTP伺服器的21埠,發送用戶名和密碼登錄,登錄成功後要list列表或者讀取數據時,發送PASV命令到FTP伺服器, 伺服器在本地隨機開放一個埠(1024以上),然後把開放的埠告訴客戶端, 客戶端再連接到伺服器開放的埠進行數據傳輸。
二.兩種模式的比較
從上面的運行原來看到,主動模式和被動模式的不同簡單概述為: 主動模式傳送數據時是「伺服器」連接到「客戶端」的埠;被動模式傳送數據是「客戶端」連接到「伺服器」的埠。
主動模式需要客戶端必須開放埠給伺服器,很多客戶端都是在防火牆內,開放埠給FTP伺服器訪問比較困難。
被動模式只需要伺服器端開放埠給客戶端連接就行了。
三.不同工作模式的網路設置
實際項目中碰到的問題是,FTP的客戶端和伺服器分別在不同網路,兩個網路之間有至少4層的防火牆,伺服器端只開放了21埠, 客戶端機器沒開放任何埠。FTP客戶端連接採用的被動模式,結果客戶端能登錄成功,但是無法LIST列表和讀取數據。很明顯,是因為伺服器端沒開放被動模式下的隨機埠導致。
由於被動模式下,伺服器端開放的埠隨機,但是防火牆要不能全部開放,解決的方案是,在ftp伺服器配置被動模式下開放隨機埠在 50000-60000之間(范圍在ftp伺服器軟體設置,可以設置任意1024上的埠段),然後在防火牆設置規則,開放伺服器端50000-60000之間的埠端。
主動模式下,客戶端的FTP軟體設置主動模式開放的埠段,在客戶端的防火牆開放對應的埠段。
四.如何設置 工作模式
實時上FTP伺服器一般都支持主動和被動模式,連接採用何種模式是有FTP客戶端軟體決定。
Ⅲ 如何用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.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
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的登陸
/**
*依賴commons-net-3.4.jar,commons-io-2.4.jar
*/
publicclassFtpUtils{
/**
*上傳
*@paramhostFTP地址
*@paramport埠ftp默認22,sftp默認23
*@paramuserftp用戶名
*@parampwdftp密碼
*@paramdestPathFTP文件保存路徑
*@paramfileNameftp保存文件名稱
*@paramfile需要上傳的文件
*/
publicstaticvoipload(Stringhost,intport,Stringuser,Stringpwd,StringdestPath,StringfileName,Filefile){
FTPClientftp=null;
InputStreamfis=null;
try{
//1.建立連接
ftp=newFTPClient();
ftp.connect(host,port);
//2.驗證連接地址
intreply=ftp.getReplyCode();
if(FTPReply.isPositiveCompletion(reply)){
ftp.disconnect();
return;
}
//3.登錄
ftp.login(user,pwd);
//設置上傳路徑、緩存、字元集、文件類型等
ftp.changeWorkingDirectory(destPath);
ftp.setBufferSize(1024);
ftp.setControlEncoding("UTF-8");
ftp.setFileType(FTP.BINARY_FILE_TYPE);
//4.上傳
fis=newFileInputStream(file);
ftp.storeFile(fileName,fis);
}catch(SocketExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}finally{
IOUtils.closeQuietly(fis);
try{
if(ftp.isAvailable()){
ftp.logout();
}
if(ftp.isConnected()){
ftp.disconnect();
}
//刪除上傳臨時文件
if(null!=file&&file.exists()){
file.delete();
}
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
Ⅳ JAVA編寫FTP連接報錯java.net.ConnectException: Connection refused: connect FTP
你用的FTPClient引入不對吧,我們項目上都是用的
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
下面是我們項目上用到的FTP的實現代碼(FTP需要先連接,再登錄,之後就是校驗登錄是否成功),具體代碼如下:
/**
*獲取FTPClient對象
*
*@paramftpHostFTP主機伺服器
*@paramftpPasswordFTP登錄密碼
*@paramftpUserNameFTP登錄用戶名
*@paramftpPortFTP埠默認為21
*@returnFTPClient
*@throwsException
*/
(StringftpHost,StringftpUserName,
StringftpPassword,intftpPort)throwsException{
try{
FTPClientftpClient=newFTPClient();
ftpClient.connect(ftpHost,ftpPort);//連接FTP伺服器
ftpClient.login(ftpUserName,ftpPassword);//登陸FTP伺服器
if(!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())){
logger.error("未連接到FTP,用戶名或密碼錯誤!");
ftpClient.disconnect();
returnnull;
}else{
logger.info("FTP連接成功!");
returnftpClient;
}
}catch(){
logger.error("FTP的IP地址可能錯誤,請正確配置!");
throwsocketException;
}catch(IOExceptionioException){
logger.error("FTP的埠錯誤,請正確配置!");
throwioException;
}
}
Ⅵ 如何用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){}
}
Ⅶ ftp的埠是多少
FTP埠號是21。
在FTP伺服器中,我們往往會給不同的部門或者某個特定的用戶設置一個帳戶。但是,這個賬戶有個特點,就是其只能夠訪問自己的主目錄。
伺服器通過這種方式來保障FTP服務上其他文件的安全性。這類帳戶,在Vsftpd軟體中就叫做Guest用戶。擁有這類用戶的帳戶,只能夠訪問其主目錄下的目錄,而不得訪問主目錄以外的文件。
(7)java及ftp埠擴展閱讀:
ASCII傳輸方式:
假定用戶正在拷貝的文件包含的簡單ASCII碼文本,如果在遠程機器上運行的不是UNIX,當文件傳輸時ftp通常會自動地調整文件的內容以便於把文件解釋成另外那台計算機存儲文本文件的格式。
但是常常有這樣的情況,用戶正在傳輸的文件包含的不是文本文件,它們可能是程序,資料庫,字處理文件或者壓縮文件。在拷貝任何非文本文件之前,用binary 命令告訴ftp逐字拷貝。