• android 基于apache ftp server


    最近研究了一下在android端实现ftp server 功能,在网上搜了几个,没有能用的基本是各种抄袭,还是自己研究吧

    首先到 apache官网下载ftp server 相关jar和配置文件,最新的是Apache FtpServer 1.0.6 Release版本


    看一下效果图:





    由于是apache已经将ftp server相关的实现封装的很好了,所以实现起来就简单多了

    导入路径\apache-ftpserver-1.0.6\common\lib下相关jar包

    主要的jar包文件



    实现代码:


    package com.orgcent.ftp;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.InetAddress;
    import java.net.NetworkInterface;
    import java.net.SocketException;
    import java.util.Enumeration;
    
    import org.apache.ftpserver.FtpServer;
    import org.apache.ftpserver.FtpServerFactory;
    import org.apache.ftpserver.ftplet.FtpException;
    import org.apache.ftpserver.listener.ListenerFactory;
    import org.apache.ftpserver.ssl.SslConfigurationFactory;
    import org.apache.ftpserver.usermanager.PropertiesUserManagerFactory;
    
    import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.os.Environment;
    import android.util.Log;
    import android.widget.TextView;
    
    public class FtpServerActivity extends Activity {
    
    	
    	private FtpServer mFtpServer;
    	private String ftpConfigDir= Environment.getExternalStorageDirectory().getAbsolutePath()+"/ftpConfig/";
    
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		
    		TextView tv=(TextView)findViewById(R.id.tvText);
    		String info="请通过浏览器或者我的电脑访问以下地址\n"+"ftp://"+getLocalIpAddress()+":2221\n";
    		tv.setText(info);
    		
    		File f=new File(ftpConfigDir);
    		if(!f.exists())
    			f.mkdir();
    		copyResourceFile(R.raw.users, ftpConfigDir+"users.properties");
    		Config1();
    	}
    
    	 public String getLocalIpAddress() {
    	    	String strIP=null;
    	        try {
    	            for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
    	                NetworkInterface intf = en.nextElement();
    	                for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
    	                    InetAddress inetAddress = enumIpAddr.nextElement();
    	                    if (!inetAddress.isLoopbackAddress()) {
    	                    	strIP= inetAddress.getHostAddress().toString();
    	                    }
    	                }
    	            }
    	        } catch (SocketException ex) {
    	            Log.e("msg", ex.toString());
    	        }
    	        return strIP;
    	    }
    	 
    	private void copyResourceFile(int rid, String targetFile){
            InputStream fin = ((Context)this).getResources().openRawResource(rid);
            FileOutputStream fos=null;
            int length;
    		try {
    			fos = new FileOutputStream(targetFile);
    			byte[] buffer = new byte[1024]; 
    	        while( (length = fin.read(buffer)) != -1){
    	            fos.write(buffer,0,length);
    	        }
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally{
    			if(fin!=null){
    				try {
    					fin.close();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    			 if(fos!=null){
    				 try {
    					fos.close();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			 }
    		}
        }
    	
    	void Config1(){
    //		Now, let's configure the port on which the default listener waits for connections.
    
    			FtpServerFactory 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";//"/sdcard/users.properties";
    			File files=new File(filename);
    			
    			userManagerFactory.setFile(files);
    	        serverFactory.setUserManager(userManagerFactory.createUserManager());
    			// set the port of the listener
    			factory.setPort(2221);
    
    			// replace the default listener
    			serverFactory.addListener("default", factory.createListener());
    			                
    			// start the server
    			FtpServer server = serverFactory.createServer(); 
    			this.mFtpServer = server;       
    			try {
    				server.start();
    			} catch (FtpException e) {
    				e.printStackTrace();
    			}
    	}
    	
    	void Config2(){
    //		Now, let's make it possible for a client to use FTPS (FTP over SSL) for the default listener.
    
    
    		FtpServerFactory serverFactory = new FtpServerFactory();
    		        
    		ListenerFactory factory = new ListenerFactory();
    		        
    		// set the port of the listener
    		factory.setPort(2221);
    
    		// define SSL configuration
    		SslConfigurationFactory ssl = new SslConfigurationFactory();
    		ssl.setKeystoreFile(new File(ftpConfigDir+"ftpserver.jks"));
    		ssl.setKeystorePassword("password");
    
    		// set the SSL configuration for the listener
    		factory.setSslConfiguration(ssl.createSslConfiguration());
    		factory.setImplicitSsl(true);
    
    		// replace the default listener
    		serverFactory.addListener("default", factory.createListener());
    		        
    		PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory();
    		userManagerFactory.setFile(new File(ftpConfigDir+"users.properties"));
    		        
    		serverFactory.setUserManager(userManagerFactory.createUserManager());
    		        
    		// start the server
    		FtpServer server = serverFactory.createServer(); 
    		this.mFtpServer = server;  
    		try {
    			server.start();
    		} catch (FtpException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	@Override
    	protected void onDestroy() {
    		super.onDestroy();
    		
    		if(null != mFtpServer) {
    			mFtpServer.stop();
    			mFtpServer = null;
    		}
    	}
    	
    }


    最重要一步,配置文件修改

    配置文件所在目录:apache-ftpserver-1.0.6\res\conf

    这里我们主要使用users.properties配置文件,修改内容如下

    # Licensed to the Apache Software Foundation (ASF) under one
    # or more contributor license agreements.  See the NOTICE file
    # distributed with this work for additional information
    # regarding copyright ownership.  The ASF licenses this file
    # to you under the Apache License, Version 2.0 (the
    # "License"); you may not use this file except in compliance
    # with the License.  You may obtain a copy of the License at
    #
    #  http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing,
    # software distributed under the License is distributed on an
    # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    # KIND, either express or implied.  See the License for the
    # specific language governing permissions and limitations
    # under the License.
    
    # Password is "admin"
    ftpserver.user.admin.userpassword=21232F297A57A5A743894A0E4A801FC3
    
    ftpserver.user.admin.homedirectory=/mnt/sdcard
    ftpserver.user.admin.enableflag=true
    ftpserver.user.admin.writepermission=true
    ftpserver.user.admin.maxloginnumber=0
    ftpserver.user.admin.maxloginperip=0
    ftpserver.user.admin.idletime=0
    ftpserver.user.admin.uploadrate=0
    ftpserver.user.admin.downloadrate=0
    
    ftpserver.user.anonymous.userpassword=admin
    ftpserver.user.anonymous.homedirectory=/mnt/sdcard
    ftpserver.user.anonymous.enableflag=true
    ftpserver.user.anonymous.writepermission=true
    ftpserver.user.anonymous.maxloginnumber=20
    ftpserver.user.anonymous.maxloginperip=2
    ftpserver.user.anonymous.idletime=300
    ftpserver.user.anonymous.uploadrate=4800
    ftpserver.user.anonymous.downloadrate=4800


    最后别忘了相关权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
        </uses-permission>
        <uses-permission android:name="android.permission.INTERNET" >
        </uses-permission>
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
        </uses-permission>
        <uses-permission android:name="android.permission.READ_PHONE_STATE" >
        </uses-permission>
        <uses-permission android:name="android.permission.WAKE_LOCK" >
        </uses-permission>
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
        </uses-permission>

    ok,这样简单的就完成了android端ftp server 服务器功能








  • 相关阅读:
    【Canvas】(1)---概述+简单示例
    【jQuery】(8)---jquery Ajax
    lastlogon
    windows server core 2016 IIS远程管理的那些坑
    开机手机显示存储空间不足某些系统功能可能无法正常使用,而且无法取消这个界面,导致手机停在这个界面无法操作。
    javascript prototype理解
    微信小程序诡异错误this.setData报错
    转:goproxy和go modules的初步使用
    真机调试No target device的解决(android studio)3.4.1
    unable to access android sdk add-on list的解决
  • 原文地址:https://www.cnblogs.com/happyxiaoyu02/p/6818957.html
Copyright © 2020-2023  润新知