日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java连接FTP服务器并且实现对其文件的上传和下载

發(fā)布時間:2025/3/20 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java连接FTP服务器并且实现对其文件的上传和下载 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

概述

? FTP是File Transfer Protocol(文件傳輸協(xié)議)的英文簡稱,而中文簡稱為“文傳協(xié)議”。FTP作為網(wǎng)絡(luò)共享文件的傳輸協(xié)議,在網(wǎng)絡(luò)應(yīng)用軟件中具有廣泛的應(yīng)用。FTP的目標是提高文件的共享性和可靠高效地傳送數(shù)據(jù)。在FTP的使用當中,用戶經(jīng)常遇到兩個概念:"下載"(Download)和"上傳"(Upload)。本文就主要針對這兩個操作來進行說明(當然,也包括FTP服務(wù)器的連接和登錄等操作)。

?

版權(quán)說明

商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
本文作者:Q-WHai
發(fā)表日期: 2015年11月12日
本文鏈接:http://blog.csdn.net/lemon_tree12138/article/details/49777467
來源:CSDN
更多內(nèi)容:分類 >>?Thinking In Java

?

筆者環(huán)境

? 系統(tǒng)環(huán)境:Windows 7(客戶端與服務(wù)器均是)

? 服務(wù)器:自建FTP服務(wù)器(關(guān)于FTP服務(wù)器的搭建,本文不作說明。網(wǎng)上都有.)

? 開發(fā)環(huán)境:Jdk 1.8

? 引入第三方庫:commons-net-2.2.jar(針對第一種方法)

?

一、基于第三方庫FtpClient的FTP服務(wù)器數(shù)據(jù)傳輸

? 由于是基于第三方庫,所以這里基本上沒有太多要說明的東西。就是導(dǎo)入第三方庫再調(diào)用即可,調(diào)用過程從下面的代碼可以參見。為了便于文章的完整性,這也是給出其程序結(jié)構(gòu)圖吧。

圖-1 基于FtpClient的FTP網(wǎng)絡(luò)文件傳輸圖

?

1.FTP的連接及登錄

?

public static FtpClient connectFTP(String url, int port, String username, String password) {//創(chuàng)建ftpFtpClient ftp = null;try {//創(chuàng)建地址SocketAddress addr = new InetSocketAddress(url, port);//連接ftp = FtpClient.create();ftp.connect(addr);//登陸ftp.login(username, password.toCharArray());ftp.setBinaryType();} catch (FtpProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return ftp;}

2.上傳文件到FTP服務(wù)器

?

public static void upload(String localFile, String ftpFile, FtpClient ftp) {OutputStream os = null;FileInputStream fis = null;try {// 將ftp文件加入輸出流中。輸出到ftp上os = ftp.putFileStream(ftpFile);File file = new File(localFile);// 創(chuàng)建一個緩沖區(qū)fis = new FileInputStream(file);byte[] bytes = new byte[1024];int c;while((c = fis.read(bytes)) != -1){os.write(bytes, 0, c);}System.out.println("upload success!!");} catch (FtpProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {if(os!=null) {os.close();}if(fis!=null) {fis.close();}} catch (IOException e) {e.printStackTrace();}}}

?

3.從FTP服務(wù)器下載文件

?

public static void download(String localFile, String ftpFile, FtpClient ftp) {InputStream is = null;FileOutputStream fos = null;try {// 獲取ftp上的文件is = ftp.getFileStream(ftpFile);File file = new File(localFile);byte[] bytes = new byte[1024];int i;fos = new FileOutputStream(file);while((i = is.read(bytes)) != -1){fos.write(bytes, 0, i);}System.out.println("download success!!");} catch (FtpProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {if(fos!=null) {fos.close();}if(is!=null){is.close();}} catch (IOException e) {e.printStackTrace();}}}

?

??

?

二、基于Socket的FTP服務(wù)器數(shù)據(jù)傳輸

? 其實上面的基于第三方包FtpClient的方法中,原理層也是基于Socket來進行通信的。所以,我們當然也可以使用Socket直接來寫這個FtpClient的代碼。下面給出基于Socket通信的結(jié)構(gòu)構(gòu)架圖。這里有一點需要大家注意一下,我們的FTP協(xié)議中有兩個端口(20和21)。通常情況下,我們的21號端口就是平時大家口口相傳的是FTP服務(wù)器的端口號,不過其實它只是FTP服務(wù)器中的命令端口號。它是負責(zé)傳送命令給FTP,一些操作如“登錄”、“改變目錄”、“刪除文件”,依靠這個連接發(fā)送命令就可完成。而對于20號端口號(也有可能是其它的一些端口號),對于有數(shù)據(jù)傳輸?shù)牟僮?#xff0c;主要是顯示目錄列表,上傳、下載文件,我們需要依靠另一個Socket來完成。

? 所以在下面的結(jié)構(gòu)圖中,我們可以看到我們有重新獲得端口號的過程,正是這個原因。

圖-2 基于Socket的FTP網(wǎng)絡(luò)文件傳輸圖

?

1.FTP連接

?

public void connectFtp() {try {mFtpClient = new Socket(Config.FTP.HOST_IP, Config.FTP.HOST_PORT);mReader = new BufferedReader(new InputStreamReader(mFtpClient.getInputStream()));mWriter = new BufferedWriter(new OutputStreamWriter(mFtpClient.getOutputStream()));sendCommand("USER " + Config.FTP.FTP_USERNAME);sendCommand("PASS " + Config.FTP.FTP_PASSWD);} catch (IOException e) {e.printStackTrace();}}

?

2.向FTP服務(wù)器發(fā)送命令

?

?

private void sendCommand(String command) throws IOException {if (Tools.StringTools.isEmpty(command)) {return;}if (mFtpClient == null) {return;}mWriter.write(command + "\r\n");mWriter.flush();}

?

3.向FTP服務(wù)器上傳文件

?

?

public void uploadFile(String localPath, String ftpPath) throws IOException {// 進入被動模式sendCommand("PASV");// 獲得ip和端口String response = readNewMessage();String[] ipPort = getIPPort(response);String ip = ipPort[0];int port = Integer.parseInt(ipPort[1]);// 建立數(shù)據(jù)端口的連接Socket dataSocket = new Socket(ip, port);sendCommand("STOR " + ftpPath);// 上傳文件前的準備File localFile = new File(localPath);OutputStream outputStream = dataSocket.getOutputStream();FileInputStream fileInputStream = new FileInputStream(localFile);// 上傳文件int offset;byte[] bytes = new byte[1024];while ((offset = fileInputStream.read(bytes)) != -1) {outputStream.write(bytes, 0, offset);}System.out.println("upload success!!");// 上傳文件后的善后工作outputStream.close();fileInputStream.close();dataSocket.close();}

?

4.從FTP服務(wù)器下載文件

public void downloadFile(String localPath, String ftpPath) throws IOException {// 進入被動模式sendCommand("PASV");// 獲得ip和端口String response = readNewMessage();String[] ipPort = getIPPort(response);String ip = ipPort[0];int port = Integer.parseInt(ipPort[1]);// 建立數(shù)據(jù)端口的連接Socket dataSocket = new Socket(ip, port);sendCommand("RETR " + ftpPath);// 下載文件前的準備File localFile = new File(localPath);InputStream inputStream = dataSocket.getInputStream();FileOutputStream fileOutputStream = new FileOutputStream(localFile);// 下載文件int offset;byte[] bytes = new byte[1024];while ((offset = inputStream.read(bytes)) != -1) {fileOutputStream.write(bytes, 0, offset);}System.out.println("download success!!");// 下載文件后的善后工作inputStream.close();fileOutputStream.close();dataSocket.close();}

?

5.斷開FTP服務(wù)器連接

?

public void disconnectFtp() {if (mFtpClient == null) {return;}if (!mFtpClient.isConnected()) {return;}try {mFtpClient.close();} catch (IOException e) {e.printStackTrace();}}

?

?

?

本文參考:

http://www.ibm.com/developerworks/cn/linux/l-cn-socketftp/

?

源碼下載:

http://download.csdn.net/detail/u013761665/9264175

https://github.com/DemoForBlog/TransmissionOnFTP

總結(jié)

以上是生活随笔為你收集整理的Java连接FTP服务器并且实现对其文件的上传和下载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。