Реализация FTP-сервера Apache Mina Java — клиент завис в ожидании приветственного сообщения

Я реализую FTP-сервер на Java для проекта. Я могу запустить сервер, но когда я пытаюсь подключиться к клиенту, он застревает в состоянии «ожидание приветственного сообщения». Я посмотрел на несколько примеров, но я не уверен, где я ошибаюсь. Вот какой у меня класс. В конечном итоге я разобью некоторые из них на другие методы.

Пользовательские параметры были очищены для целей этого поста.

public class FTPServer {


final int PORT = 2221;
String userfile = "";
String username="";
String password = ""
String homedir ="";

private FtpServer server=null;
public FTPServer() {}

public FTPServer(final String ipaddress, final int port){   


FtpServerFactory serverFactory = new FtpServerFactory();
ListenerFactory listenerfactory = new ListenerFactory();

    listenerfactory.setDataConnectionConfiguration(
    new DataConnectionConfigurationFactory().createDataConnectionConfiguration());

    ConnectionConfigFactory connection = new ConnectionConfigFactory();
    connection.setMaxLoginFailures(10);
    connection.setLoginFailureDelay(5);
    connection.setAnonymousLoginEnabled(false);

// set the ip address of the listener
listenerfactory.setServerAddress(ipaddress);

// set the port of the listener
if (port == 0)
{ listenerfactory.setPort(PORT);}

else {listenerfactory.setPort(port);
// replace the default listener
serverFactory.addListener("default", listenerfactory.createListener());
     serverFactory.setConnectionConfig(connection.createConnectionConfig());

}

PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory();
userManagerFactory.setFile(new File(userfile));
userManagerFactory.setPasswordEncryptor(new SaltedPasswordEncryptor());
UserManager um = userManagerFactory.createUserManager();
BaseUser user = new BaseUser();

user.setName(username);
user.setPassword(password);
user.setHomeDirectory(homedir);
try {
    um.save(user);
} catch (FtpException e1) {
    // TODO Auto-generated catch block
    this.StopServer();
    e1.printStackTrace();
}

serverFactory.setUserManager(um);
    server = serverFactory.createServer();

}

public void  StopServer(){ this.server.stop(); }

public void StartServer()
{
try {
    server.start();
} catch (FtpException e) {
    // handle this eventually, good enough for testing now
    e.printStackTrace();
}
}

Вот код, который создает сервер, запускает и останавливает его.

final int port = 0;
final String ipaddress = "";
FTPServer server = new FTPServer(ipaddress,port);
server.StartServer();
 server.StopServer();

person David Green    schedule 24.05.2018    source источник


Ответы (1)


Я бы сказал, что FtpServer.Start начинает прослушивать только входящий порт. Это не блокирует. Сразу же после этого вы убиваете сервер, вызывая .Stop.

Вы должны ждать в своем коде явно, чтобы сервер работал.

server.StartServer();
Thread.sleep(Long.MAX_VALUE);
person Martin Prikryl    schedule 24.05.2018
comment
Нужен ли мне сон, если у меня установлена ​​точка останова в StartServer()? Я бегу к точке останова и запускаю сервер, затем пытаюсь подключиться. В конце концов между StartServer() и StopServer() будет происходить передача файлов. - person David Green; 24.05.2018
comment
Если ваш сервер приостановлен в отладчике, он вряд ли сможет принимать соединения. - person Martin Prikryl; 24.05.2018
comment
хм, я имел в виду, что я установил точку останова в StopServer(), и в отладчике я вижу, что сервер работает. по крайней мере, для свойства, которое говорит, работает ли оно, установлено значение true. - person David Green; 24.05.2018
comment
Это то, что я имею в виду. Вы остановили процесс в отладчике (я имею в виду весь процесс, а не FTP-сервер). Поэтому он не может принимать запросы. И как только вы возобновляете процесс, он вызывает StopServer. Так что нет момента, когда он может принимать входящие запросы. Вы даже пытались использовать sleep, как я предложил? - person Martin Prikryl; 24.05.2018
comment
Еще нет. Я попробую это. Я неправильно понял, что делает точка останова, и просто пытался это понять. Спасибо за разъяснения. - person David Green; 24.05.2018
comment
Я попытался добавить Thread.Sleep(). У меня была та же проблема, и после выхода из спящего режима возникло исключение IncomatibleClassChange. Я собираюсь осмотреться и посмотреть, смогу ли я найти еще какой-нибудь пример кода, который реализует сервер. Я пытаюсь встроить сервер в другой более крупный проект. - person David Green; 25.05.2018