Apache FTPServer 相关文档

Step0(可选):修改maven为国内源

  • IDE 为 IDEA

  • 右键 pom.xml,maven,open ‘settings.xml’

  • 找到 <mirrors>,添加如下内容

    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>central</mirrorOf>
        <name>阿里云公共仓库</name>
        <url>https://maven.aliyun.com/repository/central</url>
    </mirror>
    

Step1:准备

1.1 添加依赖
<dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.30</version>
        <!--<scope>test</scope>-->
    </dependency>
    <dependency>
        <groupId>org.apache.ftpserver</groupId>
        <artifactId>ftpserver-core</artifactId>
        <version>1.0.6</version>
        <!--<scope>test</scope>-->
    </dependency>
</dependencies>

我这里 ftpserver-core 版本最高至 1.0.6,虽然 Maven repository 中搜索到了1.1.1版本,但是下载不了,出现 failed to read artifact descriptor 之类的错误

1.2 添加log4j配置文件

在 resources 文件夹中新建名为 log4j.properties 文件,内容如下

log4j.rootLogger=INFO,logfile,stdout
            
#log4j.logger.org.springframework.web.servlet=INFO,db

#log4j.logger.org.springframework.beans.factory.xml=INFO
#log4j.logger.com.neam.stum.user=INFO,db

#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} %p [%c] %X{remoteAddr}  %X{remotePort}  %X{remoteHost}  %X{remoteUser} operator\:[姓名\:%X{userName} 工号\:%X{userId}] message\:<%m>%n

#write log into file
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.Threshold=warn
log4j.appender.logfile.File=${webapp.root}\\logs\\main.log
log4j.appender.logfile.DatePattern=.yyyy-MM-dd
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=[AppLog] %d{yyyy-MM-dd HH\:mm\:ss} %X{remoteAddr} %X{remotePort} %m %n

#display in console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Threshold=info
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[AppLog] %d{yyyy-MM-dd HH\:mm\:ss} %X{remoteAddr} %X{remotePort} %m %n

Step2:代码

public static void main(String[] args) throws FtpException 
{
	//xxxFactory代表xxx结点的工厂类,通过工厂类配置与生成相应XML结点
	//以下代码相当于生成一个XML配置文件
    FtpServerFactory serverFactory = new FtpServerFactory();

    ListenerFactory listenerFactory = new ListenerFactory();
    listenerFactory.setPort(3131);
	//生成nio-listener节点中的dataConnection结点
    DataConnectionConfigurationFactory dataConnection = 
    	new DataConnectionConfigurationFactory();
    dataConnection.setPassivePorts("10000-10500");
    //将配置好的dataConnection结点添加至nio-listener节点中
    listenerFactory.setDataConnectionConfiguration(dataConnection
    	.createDataConnectionConfiguration());
	//生成nio-listener节点
    Listener listener = listenerFactory.createListener();
    //将nio-listener节点添加至Server结点中
    serverFactory.addListener("default", listener);

	//通过配置文件配置用户信息
    //PropertiesUserManagerFactory userManager = new PropertiesUserManagerFactory();
    //userManager.setFile(new File("users.properties"));
    //serverFactory.setUserManager(userManager.createUserManager());
	
	//生成与配置用户信息
    BaseUser user = new BaseUser();
    user.setName("admin");
    user.setPassword("admin");
    var homeDir = System.getProperty("user.dir").replace("\\", "/");
    user.setHomeDirectory(homeDir);
    user.setAuthorities(new ArrayList<Authority>());
    serverFactory.getUserManager().save(user);

    FtpServer server = serverFactory.createServer();
    server.start();
}

以上代码等同于生成一个XML配置文件和一个用户的properties文件,如下所示

<?xml version="1.0" encoding="UTF-8"?>
<!--其中有些内容我省略了,具体配置文件可在下载包的res\conf中查看-->
<server>
    <listeners>
        <nio-listener name="default" port="3131">
            <data-connection>
                <active enabled="true"/>
                <passive ports="10000-10500"/>
            </data-connection>
        </nio-listener>
    </listeners>
    <!--通过配置文件配置用户信息-->
    <!--<file-user-manager file="users.properties"
                       encrypt-passwords="clear"/>-->
</server>
ftpserver.user.admin.userpassword=admin
ftpserver.user.admin.homedirectory=./
ftpserver.user.admin.enableflag=true
ftpserver.user.admin.writepermission=true
ftpserver.user.admin.maxloginnumber=20
ftpserver.user.admin.maxloginperip=6
ftpserver.user.admin.idletime=0
ftpserver.user.admin.uploadrate=48000000
ftpserver.user.admin.downloadrate=48000000

Step3:打包

在 pom.xml 添加如下代码

<build>
    <finalName>FTPServer</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.5.5</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>MAIN_CLASS_NAME</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>
                        jar-with-dependencies
                    </descriptorRef>
                </descriptorRefs>
            </configuration>
        </plugin>
    </plugins>
</build>

注意 mainClass 结点要填写 main 函数所在类全名,为 package + 类名

在 terminal 中输入以下命令打包

mvn package assembly:single

成功打包会在 terminal 界面显示包存储路径,注意包是后缀为 jar-with-dependencies 的 jar 包

Step4:运行

将 cmd 定位至包所在路径(或者在文件浏览器中路径框输入cmd回车能直接定位至当前路径),执行以下命令

java -cp PACKAGE_NAME.jar MAIN_CLASS_NAME

例如我需要执行的命令为

java -cp FTPServer-jar-with-dependencies.jar bootstrap.StartUp

其中 FTPServer-jar-with-dependencies.jar 是生成的 jar 包名称,bootstrap.StartUp 是主类类全名,bootstrap 是 package 名称,StartUp 是 main 方法所在的类名

在浏览器中输入 ftp://ServerIP:3131/ 即可访问,其中 ServerIP 为本机 IP 地址,在命令行中键入 ipconfig 即可查看

以上配置适合于1路由器+n设备的简单网络,如果是多路由器形成的网络,还需要配置路由器将数据请求转发至 FTP 服务(例如水星路由器就有一个虚拟服务器功能),最好还需要将运行FTP服务的机器IP固定(也可在路由器中设置)

停止服务只需在命令行中键入 Ctrl+C 即可。