天天看點

[Android]Android FTP Server

Android打開FTP服務端。

這個功能還是很實用的,可以友善手機和電腦之間傳輸檔案。

這個功能其實也很容易,導入幾個包,加幾個權限,然後幾行代碼就搞定了。

一.導入幾個包:

1.ftpserver-core-1.0.6.jar

2.log4j-1.2.14.jar

3.mina-core-2.0.4.jar

4.slf4j-api-1.5.2.jar

5.slf4j-log4j12-1.5.2.jar

6.commons-net-3.0.1.jar

二.加幾個權限:

1.<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />(從存儲卡上讀取相關配置)

2.<uses-permission android:name="android.permission.INTERNET" />(沒有這個綁定端口的時候會失敗的)

三.幾行代碼:

/*
 * Created by yy on 2016/11/3.
 */
public class FtpServerManager {
    private static final String TAG = "FileUtil";
    private static FtpServerManager instance = new FtpServerManager();
    private FtpServerManager() {}//構造函數私有化防止建立執行個體
    public static FtpServerManager getInstance() {
        return instance;
    }
    private static FtpServer mFtpServer;
    private static int port = 2222;// 端口号
    private static String ftpConfigDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/ftpConfig/";
    private static FtpServerFactory serverFactory;
    public void initFTPServer() {
        System.setProperty("java.net.preferIPv4Stack", "true");
        serverFactory = new FtpServerFactory();
        ListenerFactory factory = new ListenerFactory();
        PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory();

        String[] str = {"mkdir", ftpConfigDir};
        try {
            Process ps = Runtime.getRuntime().exec(str);
            try {
                ps.waitFor();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        String filename = ftpConfigDir + "users.properties";
        File files = new File(filename);
        userManagerFactory.setFile(files);
        serverFactory.setUserManager(userManagerFactory.createUserManager());
        factory.setPort(port);
        serverFactory.addListener("default", factory.createListener());
        FtpServer server = serverFactory.createServer();
        mFtpServer = server;
    }
    public void startFTPService() {
//        Log.i(TAG, "通知: 開啟FTPService");
        if (mFtpServer == null) {
//            Log.i(TAG, "通知: mFtpServer為null");
            mFtpServer = serverFactory.createServer();
            try {
                mFtpServer.start();
            } catch (FtpException e) {
                e.printStackTrace();
            }
        } else {
//            Log.i(TAG, "通知: mFtpServer不為null");
            if (mFtpServer.isStopped() == true) {
                try {
                    mFtpServer.start();
//                    Log.i(TAG, "通知: 開啟FTPService===2");
                } catch (FtpException e) {
                    e.printStackTrace();
                }
            }
        }
//        Log.i(TAG, "通知: mFtpServer.isStopped() " + mFtpServer.isStopped());
    }
    public void restartFTPService() {
        Log.i(TAG, "通知: 重新開機FTPService");
        if (mFtpServer != null) {
            if (mFtpServer.isStopped() == false) {
                mFtpServer.resume();
            }
        }
    }
    public void stopFTPService() {
        Log.i(TAG, "通知: 關閉FTPService");
        if (mFtpServer != null) {
            Log.i(TAG, "通知: mFtpServer不為null");
            if (mFtpServer.isStopped() == false) {
                mFtpServer.stop();
                Log.i(TAG, "mFtpServer.isStopped():" + mFtpServer.isStopped());
            }
            mFtpServer = null;
        }
        Log.i(TAG, "通知: 關閉成功");
    }
}
           

四.使用說明:

1.在/sdcard/ftpConfig目錄下放入users.properties檔案,内容如下:

# Password is "admin"

ftpserver.user.admin.userpassword=21232F297A57A5A743894A0E4A801FC3

ftpserver.user.admin.homedirectory=/sdcard/

ftpserver.user.admin.enableflag=true

ftpserver.user.admin.writepermission=true

ftpserver.user.admin.maxloginnumber=20

ftpserver.user.admin.maxloginperip=5

ftpserver.user.admin.idletime=300

ftpserver.user.admin.uploadrate=4800000

ftpserver.user.admin.downloadrate=4800000

2.調用時先初始化,再開始,最後停止。

3.長時間開始會導緻FTP服務有時不好用,可能跟android資源回收導緻,是以每一段時間可以選擇restart一下

恩,就到這裡,随後寫一個demo上傳上來友善自己使用,GitHub位址如下:

https://github.com/yy4myself/FTPService.git

後面還會繼續維護,要改的地方還很多