设为首页 收藏本站
查看: 2559|回复: 0

[经验分享] APACHE基于MINA的FTP SERVER(二)服务器初始化

[复制链接]

尚未签到

发表于 2016-6-10 13:32:17 | 显示全部楼层 |阅读模式
APACHE基于MINA的FTP SERVER(二)服务器初始化

需要引入的JAR包
<dependency>
<groupId>org.apache.ftpserver</groupId>
<artifactId>ftpserver-core</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
</dependency>

web.xml配置启动时调用spring初始化
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>
   org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

spring配置调用核心类FtpServerServiceImpl初始化FTP的SERVER池
<beans default-autowire="byName">
<bean name="ftpServerService" class="com.sillycat.easyftp.server.impl.FtpServerServiceImpl"
   init-method="init">
   <property name="configFile" value="${ftpserver.config.file}" />
</bean>
</beans>

单元测试中
public void testStop() {
FtpServerService ftpServerService = (FtpServerService) appContext.getBean("ftpServerService");
//停止名字为ftpsillycat的server
ftpServerService.stop("ftpsillycat");
}

服务器的初始化的核心类FtpServerServiceImpl.java,代码如下:
package com.sillycat.easyftp.server.impl;

import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

import javax.xml.stream.XMLInputFactory;

import org.apache.ftpserver.FtpServer;
import org.apache.ftpserver.FtpServerFactory;
import org.apache.ftpserver.ftplet.FtpException;
import org.apache.ftpserver.ftplet.UserManager;
import org.apache.ftpserver.listener.ListenerFactory;
import org.apache.ftpserver.usermanager.ClearTextPasswordEncryptor;
import org.apache.ftpserver.usermanager.Md5PasswordEncryptor;
import org.apache.ftpserver.usermanager.PasswordEncryptor;
import org.apache.ftpserver.usermanager.PropertiesUserManagerFactory;
import org.apache.ftpserver.usermanager.SaltedPasswordEncryptor;
import org.apache.ftpserver.usermanager.impl.BaseUser;

import com.sillycat.easybase.base.BaseManager;
import com.sillycat.easybase.constants.FtpConstants;
import com.sillycat.easyftp.config.FtpServerConfig;
import com.sillycat.easyftp.config.UserServerConfig;
import com.sillycat.easyftp.server.FtpServerService;
import com.sillycat.easyftp.utils.XmlResourceUtil;

public class FtpServerServiceImpl extends BaseManager implements
   FtpServerService {
//ftp服务器的池
private ConcurrentHashMap<String, FtpServer> ftpServerPool;
//配置集合
private List<FtpServerConfig> ftpServerConfigs;
//读取的XML配置文件
private String configFile;
//启动服务器
public void start(String name) {
   FtpServer ftpServer = ftpServerPool.get(name);
   try {
    ftpServer.start();
   } catch (FtpException e) {
    e.printStackTrace();
   }
}
//停止服务器
public void stop(String name) {
   FtpServer ftpServer = ftpServerPool.get(name);
   ftpServer.stop();
}
//重启服务器
public void resume(String name) {
   FtpServer ftpServer = ftpServerPool.get(name);
   ftpServer.resume();
}
//暂停服务器
public void suspend(String name) {
   FtpServer ftpServer = ftpServerPool.get(name);
   ftpServer.suspend();
}

public void init() {
   // 初始化变量
   ftpServerPool = new ConcurrentHashMap<String, FtpServer>();
   ftpServerConfigs = new ArrayList<FtpServerConfig>();
   // 装在配置文件
   loadConfig();
   if (ftpServerConfigs != null && !ftpServerConfigs.isEmpty()) {
    initFtpServerPool();
   } else {
    logger.error("no config info for FtpServerServiceImpl!");
    throw new RuntimeException(
      "no config info for FtpServerServiceImpl!");
   }
}
//初始化FTP服务器池
public void initFtpServerPool() {
   for (int i = 0; i < ftpServerConfigs.size(); i++) {
    FtpServerConfig ftpServerConfig = ftpServerConfigs.get(i);
    this.addFtpServer(ftpServerConfig);
   }
   if(ftpServerPool != null && !ftpServerPool.isEmpty()){
    Iterator<String> itKey = ftpServerPool.keySet().iterator();
    for(;itKey.hasNext();){
     String key = itKey.next();
     FtpServer tmp = ftpServerPool.get(key);
     if(tmp != null){
      try {
       tmp.start();
       logger.info("ftp server " + key + " start!");
      } catch (FtpException e) {
       e.printStackTrace();
      }
     }
    }
   }
}

//读取配置文件
public void loadConfig() {
   URL url = null;
   ClassLoader loader = Thread.currentThread().getContextClassLoader();
   url = loader.getResource(this.getConfigFile());
   XMLInputFactory factory = XMLInputFactory.newInstance();
   if (url == null) {
    logger
      .error("no ftpserver config find! please put ftpserver.xml in your classpath");
    throw new java.lang.RuntimeException(
      "no ftpserver config find! please put ftpserver.xml in your classpath");
   }

   XmlResourceUtil.loadFtpServerConfigFromURL(url, factory,
     ftpServerConfigs);
   logger.info(new StringBuffer().append("load config from :").append(
     url.getFile()));
}

private void addFtpServer(FtpServerConfig ftpServerConfig) {
   FtpServerFactory ftpServerFactory = new FtpServerFactory();
   // 设置监听端口
   ListenerFactory linstenFactory = new ListenerFactory();
   linstenFactory.setPort(ftpServerConfig.getPort());
   ftpServerFactory
     .addListener("default", linstenFactory.createListener());

   // 密码加密类型
   PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory();
   PasswordEncryptor passwordEncryptor = null;
   if (FtpConstants.CLEAR_TEXT_FTP_PASSWORD_ENCRYPTOR
     .equalsIgnoreCase(ftpServerConfig.getPasswordEncryptor())) {
    passwordEncryptor = new ClearTextPasswordEncryptor();
   } else if (FtpConstants.SALTED_FTP_PASSWORD_ENCRYPTOR
     .equalsIgnoreCase(ftpServerConfig.getPasswordEncryptor())) {
    passwordEncryptor = new SaltedPasswordEncryptor();
   } else if (FtpConstants.MD5_FTP_PASSWORD_ENCRYPTOR
     .equalsIgnoreCase(ftpServerConfig.getPasswordEncryptor())) {
    passwordEncryptor = new Md5PasswordEncryptor();
   }
   userManagerFactory.setPasswordEncryptor(passwordEncryptor);
   // 用户
   UserManager um = userManagerFactory.createUserManager();
   if (ftpServerConfig.getUsers() != null
     && !ftpServerConfig.getUsers().isEmpty()) {
    for (int i = 0; i < ftpServerConfig.getUsers().size(); i++) {
     UserServerConfig tmp = ftpServerConfig.getUsers().get(i);
     addFtpUser(tmp, um);
    }
   }
   ftpServerFactory.setUserManager(um);
   FtpServer server = ftpServerFactory.createServer();
   ftpServerPool.put(ftpServerConfig.getName(), server);
}

private void addFtpUser(UserServerConfig userServerConfig, UserManager um) {
   BaseUser user = new BaseUser();
   user.setName(userServerConfig.getName());
   user.setPassword(userServerConfig.getPassword());
   user.setHomeDirectory(userServerConfig.getHomeDirectory());
   user.setEnabled(userServerConfig.getEnabled());
   user.setMaxIdleTime(userServerConfig.getMaxIdleTime());

   if (userServerConfig.getPermissions() != null
     && !userServerConfig.getPermissions().isEmpty()) {
    //权限
    user.setAuthorities(userServerConfig.getPermissions());
   }
   try {
    um.save(user);
   } catch (FtpException e) {
    e.printStackTrace();
   }
}

public String getConfigFile() {
   return configFile;
}

public void setConfigFile(String configFile) {
   this.configFile = configFile;
}

}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-228719-1-1.html 上篇帖子: 对程序简单修改后通过ftp,sftp快速远程同步程序 下篇帖子: 让proftpd也可以用mysql轻松管理用户实现ftp磁盘配额
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表