ftpjava,ftpjava ftp上傳ftpSocket為null

本文目錄一覽:

如何用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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
YHMW的頭像YHMW
上一篇 2024-10-04 00:23
下一篇 2024-10-04 00:23

相關推薦

發表回復

登錄後才能評論