编写Java FTP服务器

我正在尝试编写一个代码,以在我的独立服务器上打开FTP服务器,以便可以将文件从FTP服务器复制到另一台计算机上的客户端,反之亦然。

我得到了Apache FtpServer,但对其使用感到有些困惑,并且正在寻找使用它的基本步骤。也许像这样:

  1. 做连接命令
  2. 登录
  3. 做一些事情…

回答:

让我使用非常有用的 为您编写一个基本示例:

FtpServerFactory serverFactory = new FtpServerFactory();

ListenerFactory factory = new ListenerFactory();

factory.setPort(1234);// set the port of the listener (choose your desired port, not 1234)

serverFactory.addListener("default", factory.createListener());

PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory();

userManagerFactory.setFile(new File("/home/blablah/myusers.properties"));//choose any. We're telling the FTP-server where to read its user list

userManagerFactory.setPasswordEncryptor(new PasswordEncryptor()

{//We store clear-text passwords in this example

@Override

public String encrypt(String password) {

return password;

}

@Override

public boolean matches(String passwordToCheck, String storedPassword) {

return passwordToCheck.equals(storedPassword);

}

});

//Let's add a user, since our myusers.properties file is empty on our first test run

BaseUser user = new BaseUser();

user.setName("test");

user.setPassword("test");

user.setHomeDirectory("/home/blablah");

List<Authority> authorities = new ArrayList<Authority>();

authorities.add(new WritePermission());

user.setAuthorities(authorities);

UserManager um = userManagerFactory.createUserManager();

try

{

um.save(user);//Save the user to the user list on the filesystem

}

catch (FtpException e1)

{

//Deal with exception as you need

}

serverFactory.setUserManager(um);

Map<String, Ftplet> m = new HashMap<String, Ftplet>();

m.put("miaFtplet", new Ftplet()

{

@Override

public void init(FtpletContext ftpletContext) throws FtpException {

//System.out.println("init");

//System.out.println("Thread #" + Thread.currentThread().getId());

}

@Override

public void destroy() {

//System.out.println("destroy");

//System.out.println("Thread #" + Thread.currentThread().getId());

}

@Override

public FtpletResult beforeCommand(FtpSession session, FtpRequest request) throws FtpException, IOException

{

//System.out.println("beforeCommand " + session.getUserArgument() + " : " + session.toString() + " | " + request.getArgument() + " : " + request.getCommand() + " : " + request.getRequestLine());

//System.out.println("Thread #" + Thread.currentThread().getId());

//do something

return FtpletResult.DEFAULT;//...or return accordingly

}

@Override

public FtpletResult afterCommand(FtpSession session, FtpRequest request, FtpReply reply) throws FtpException, IOException

{

//System.out.println("afterCommand " + session.getUserArgument() + " : " + session.toString() + " | " + request.getArgument() + " : " + request.getCommand() + " : " + request.getRequestLine() + " | " + reply.getMessage() + " : " + reply.toString());

//System.out.println("Thread #" + Thread.currentThread().getId());

//do something

return FtpletResult.DEFAULT;//...or return accordingly

}

@Override

public FtpletResult onConnect(FtpSession session) throws FtpException, IOException

{

//System.out.println("onConnect " + session.getUserArgument() + " : " + session.toString());

//System.out.println("Thread #" + Thread.currentThread().getId());

//do something

return FtpletResult.DEFAULT;//...or return accordingly

}

@Override

public FtpletResult onDisconnect(FtpSession session) throws FtpException, IOException

{

//System.out.println("onDisconnect " + session.getUserArgument() + " : " + session.toString());

//System.out.println("Thread #" + Thread.currentThread().getId());

//do something

return FtpletResult.DEFAULT;//...or return accordingly

}

});

serverFactory.setFtplets(m);

//Map<String, Ftplet> mappa = serverFactory.getFtplets();

//System.out.println(mappa.size());

//System.out.println("Thread #" + Thread.currentThread().getId());

//System.out.println(mappa.toString());

FtpServer server = serverFactory.createServer();

try

{

server.start();//Your FTP server starts listening for incoming FTP-connections, using the configuration options previously set

}

catch (FtpException ex)

{

//Deal with exception as you need

}

请注意,在服务器端,您不必手动处理连接,登录等:Ftplet会为您完成此操作。

不过,您可以在匿名内部Ftplet类的覆盖方法中添加自定义的预处理过程(使用实例化时)new Ftplet(){ ... }

以上是 编写Java FTP服务器 的全部内容, 来源链接: utcz.com/qa/418493.html

回到顶部