Android Ftp 下载文件:服务端搭建,客户端编写使用详情
一? FTP與HTTP
HTTP是超文本傳輸協議;面向網頁的。
FTP是File Transfer Protocol,文件傳輸協議;面向文件的。
1.FTP
(1)FTP比HTTP復雜
FTP和HTTP一樣都是Internet上廣泛使用的協議,用來在兩臺計算機之間互相傳送文件。相比于HTTP,FTP協議要復雜得多。
復雜的原因,是因為FTP協議要用到兩個TCP連接,一個是命令鏈路,用來在FTP客戶端與服務器之間傳遞命令;另一個是數據鏈路,用來上傳或下載數據。
(2)FTP協議有兩種工作方式:主動式和被動式。兩種工作模式是服務端決定的
PORT(主動)方式的連接過程:客戶端向服務器的FTP端口(默認是21)發送連接請求,服務器接受連接,建立一條命令鏈路。
當需要傳送數據時, 客戶端在命令鏈上發送PORT命令告訴 服務器:“我打開了XXXX端口,你過來連接我”。于是 服務器從20端口向客戶端的XXXX端口發送連接請求,建立一條數據鏈路來傳送數據。
PASV(被動)方式的連接過程是:客戶端向服務器的FTP端口(默認是21)發送連接請求,服務器接受連接,建立一條命令鏈路。當需要傳送數據時, 服務器在命令鏈上用PASV命令告訴 客戶端:“我打開了XXXX端口,你過來連接我”。于是 客戶端向服務器的XXXX端口發送連接請求,建立一條數據鏈路來傳送數據。
從上面可以看出,兩種方式的命令鏈路連接方法是一樣的,而數據鏈路的建立方法就完全不同。而FTP的復雜性就在于此。
http與ftp的區別:
1.FTP要比HTTP早出現10年左右。2.HTTP協議是用來瀏覽網站的,3.FTP控制命令和傳輸數據使用兩個不同的tcp,HTTP命令和數據傳輸都是一個tcp4.HTTP持久連接,FTP每次有數據的需要時都創建一個新的連接。5.HTTP中提供壓縮算法,gzip比較有名6.HTTP支持代理
————————————————
版權聲明:本文此聲明以上部分為CSDN博主「Diligent_wu」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Diligent_wu/article/details/123458009
二 使用詳情
第一步 創建服務端
1.下載安裝Serv-U(免費試用30天)
2.下載破解包(花生殼)
請參考Serv-U 15.1.2安裝使用_超凡脫俗的博客-CSDN博客_server u使用教程
第二步 在AS上編寫客戶端程序
FTP工具類
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.SocketException;import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPClientConfig; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply;import android.R.string; import android.graphics.Bitmap.Config; import android.nfc.Tag; import android.util.Log;/** 用于Android和FTP服務器進行交互的工具類*/public class FTPUtils {private static final String Tag = null;private FTPClient ftpClient = null;private static FTPUtils ftpUtilsInstance = null;private String FTPUrl;private int FTPPort;private String UserName;private String UserPassword;private FTPUtils() {ftpClient = new FTPClient();}/* 得到類對象實例 */public static FTPUtils getInstance() {if (ftpUtilsInstance == null) {ftpUtilsInstance = new FTPUtils();ftpUtilsInstance = new FTPUtils();}return ftpUtilsInstance;}/** 設置FTP服務器* @param FTPUrl FTP服務器IP地址* @param FTPPort FTP服務器端口號* @param UserName 登陸FTP服務器的賬號* @param UserPassword 登陸FTP服務器的密碼*/public boolean initFTPSetting(String FTPUrl,int FTPPort,String UserName,String UserPassword) {this.FTPUrl = FTPUrl;this.FTPPort= FTPPort;this.UserName=UserName;this.UserPassword=UserPassword;int reply;try {//1.要連接的FTP服務器的地址、端口ftpClient.connect(FTPUrl,FTPPort);//2.登陸FTP服務器ftpClient.login(UserName, UserPassword);//3.看返回值是不是230,如果是,表示登陸成功reply = ftpClient.getReplyCode();if (!FTPReply.isPositiveCompletion(reply)) {//斷開連接ftpClient.disconnect();return false;}return true;} catch (SocketException e) {e.printStackTrace();return false;} catch (IOException e) {e.printStackTrace();return false;}}/** 上傳文件* @param FilePath 要上傳文件所在的SDCard的路徑* @param FileName 要上傳文件的文件名(如:SIM的唯一標識碼)* @return true為成功, false為失敗*/ // public boolean uploadFile(String FilePath,String FileName) { // //判斷FTP是否仍在連接 // if (!ftpClient.isConnected()) { // if (!initFTPSetting(FTPUrl, FTPPort, UserName, UserPassword)) { // return false; // } // } // // try { // //1.設置存儲路徑 // ftpClient.makeDirectory("/ftpdata"); // ftpClient.changeWorkingDirectory("/ftpdata"); // // //2.設置上傳文件需要的一些基本信息 // ftpClient.setBufferSize(1024); // ftpClient.setControlEncoding("UTF-8"); // ftpClient.enterLocalPassiveMode(); // ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // // //3.文件上傳 // FileInputStream fileInputStream = new FileInputStream(FilePath); // ftpClient.storeFile(FileName, fileInputStream); // // //4.關閉文件流 // fileInputStream.close(); // // //5.退出登錄FTP,關閉ftpClient連接 // ftpClient.logout(); // ftpClient.disconnect(); // // } catch (IOException e) { // Log.d(Tag, "UpLoad failed"); //輸出錯誤消息 // e.printStackTrace(); // return false; // } // return false; // }/** 下載文件* @param FilePath 要存放的文件路徑* @param FileName 遠程FTP服務器上的那個文件的名字* @return true為成功, false為失敗*/public boolean downLoadFile(String FilePath,String FileName) {//判斷FTP是否仍在連接if (!ftpClient.isConnected()) {if (!initFTPSetting(FTPUrl, FTPPort, UserName, UserPassword)) {return false;}}try {//1.轉到指定的下載目錄,如果是文件中的文件可以采用此方法// ftpClient.changeWorkingDirectory("/ftpdata");//2.列出該目錄下的所有文件FTPFile[] files = ftpClient.listFiles();//3.遍歷所有文件,找到指定的文件for (FTPFile file : files) {//String fileName = file.getName();if (file.getName().equals(FileName)) {//根據絕對路徑初始化文件File localFile = new File(FilePath);//輸出流FileOutputStream outputStream = new FileOutputStream(localFile);//下載文件ftpClient.retrieveFile(file.getName(), outputStream);//關閉流outputStream.close();}}//4.退出登錄FTP,關閉ftpClient的連接ftpClient.logout();ftpClient.disconnect();} catch (IOException e) {// TODO: handle exceptionLog.d(Tag, "DownLoad failed");e.printStackTrace();return false;}return true;}}主活動
import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.os.StrictMode; import android.view.View; import android.widget.Button; import android.widget.Toast;public class MainActivity extends AppCompatActivity implements View.OnClickListener {//buttonsprivate Button buttonDownLoad=null;//FTP工具類private FTPUtils ftpUtils = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//獲取控件對象buttonDownLoad=(Button)findViewById(R.id.button_2);//設置控件相應函數buttonDownLoad.setOnClickListener(this);//搭建環境的API Level必須大于等于9if (android.os.Build.VERSION.SDK_INT > 9) {StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();StrictMode.setThreadPolicy(policy);}//初始化和FTP服務器交互的類InitFTPServerSetting();}public void InitFTPServerSetting() {ftpUtils = FTPUtils.getInstance();boolean flag = ftpUtils.initFTPSetting("192.134.91.121", 21, "賬號", "密碼");if (flag == true)Toast.makeText(this, "連接成功", Toast.LENGTH_SHORT).show();}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.button_2:{//下載文件//參數為:要存放的文件路徑和遠程FTP文件名字ftpUtils.downLoadFile("/data/data/com.example.ftptestapplication/files/down01", "request.txt");}break;default:break;}} }總結
以上是生活随笔為你收集整理的Android Ftp 下载文件:服务端搭建,客户端编写使用详情的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 应用在洗衣机触摸屏中的触摸芯片
- 下一篇: 计算机毕业设计Java“花园街道”社区医