编写Java FTP服务器

我正在尝试编写一个代码,在我的独立单元上打开一个FTP服务器,所以我可以将文件从它复制到另一台计算机的客户端,相反,但我对服务器端编程很新,不明白怎么做。

我得到了Apache FtpServer,但对它的使用有点困惑,我正在寻找如何使用它的基本步骤。 也许是这样的:

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

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

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 it's 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 files is empty on our first test run BaseUser user = new BaseUser(); user.setName("test"); user.setPassword("test"); user.setHomeDirectory("/home/blablah"); List authorities = new ArrayList(); 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 m = new HashMap(); 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 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类的重写方法中添加自定义pre [或post]处理(当您使用new Ftplet(){ ... }实例化它时。