Сеть недоступна при использовании активного режима FTP на носимом устройстве

В настоящее время я пытаюсь разработать носимое приложение, которое может загружать файлы с данными акселерометра и гироскопа на мой компьютер через FTP.

Я использовал следующий код для запуска FTP-сервера на моем ПК в Eclipse:

public static void main(String[] args) throws FtpException {

    ListenerFactory listenerFactory = new ListenerFactory();
    listenerFactory.setPort(2221);

    PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory();
    UserManager userManager = userManagerFactory.createUserManager();
    BaseUser user = new BaseUser();
    user.setName("Anonymous");
    user.setPassword("");
    user.setHomeDirectory("C:\\temp");  

    List<Authority> authorities = new ArrayList<Authority>();
    authorities.add(new WritePermission());
    user.setAuthorities(authorities);
    userManager.save(user);

    FtpServerFactory factory = new FtpServerFactory();
    factory.setUserManager(userManager);
    factory.addListener("default", listenerFactory.createListener());

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

Я использую этот метод для подключения к FTP-серверу:

public void connectToFTPServer() throws IOException {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

    StrictMode.setThreadPolicy(policy);
    Log.i("CONNECT FTP SERVER", "Connecting to FTP Server");
    ftpClient.connect(server, port);
    ftpClient.login(user, pass);
    ftpClient.enterLocalActiveMode();
    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
}

И этот метод для загрузки данных датчика:

public void uploadFileTest()throws IOException {
    try
    {
        if (ftpClient.login("Anonymous", ""))
        {
            String data = this.getFilesDir() + "/" + "SensorData.txt";

            FileInputStream in = new FileInputStream(new File(data));
            boolean result = ftpClient.storeFile("SensorData.txt", in);
            in.close();
            if (result) Log.v("upload result", "succeeded");
            ftpClient.logout();
            ftpClient.disconnect();
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

Носимое устройство работает на эмуляторе в Android Studio, и даже если кажется, что соединение с FTP-сервером установлено, я получаю следующее сообщение об ошибке на FTP-сервере, когда пытаюсь загрузить данные датчика.

[main] INFO org.apache.ftpserver.impl.DefaultFtpServer - FTP server started
[NioProcessor-3] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - CREATED
[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - OPENED
[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - SENT: 220 Service ready for new user.

[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - RECEIVED: USER Anonymous
[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - SENT: 331 User name okay, need password for Anonymous.

[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - RECEIVED: PASS *****
[pool-3-thread-1] INFO org.apache.ftpserver.command.impl.PASS - Login success - Anonymous
[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - SENT: 230 User logged in, proceed.

[pool-3-thread-2] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - RECEIVED: TYPE I
[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - SENT: 200 Command TYPE okay.

[NioProcessor-4] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - CREATED
[pool-3-thread-2] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - OPENED
[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - SENT: 220 Service ready for new user.

[pool-3-thread-2] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - RECEIVED: USER Anonymous
[pool-3-thread-2] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - SENT: 331 User name okay, need password for Anonymous.

[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - RECEIVED: PASS *****
[pool-3-thread-1] INFO org.apache.ftpserver.command.impl.PASS - Login success - Anonymous
[pool-3-thread-2] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - SENT: 230 User logged in, proceed.

[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - RECEIVED: TYPE I
[pool-3-thread-2] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - SENT: 200 Command TYPE okay.

[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - RECEIVED: PORT 10,0,2,15,157,216
[pool-3-thread-2] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - SENT: 200 Command PORT okay.

[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - RECEIVED: STOR SensorData.txt
[pool-3-thread-1] WARN org.apache.ftpserver.impl.IODataConnectionFactory - FtpDataConnection.getDataSocket()
java.net.SocketException: Network is unreachable: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at org.apache.ftpserver.impl.IODataConnectionFactory.createDataSocket(IODataConnectionFactory.java:312)
    at org.apache.ftpserver.impl.IODataConnectionFactory.openConnection(IODataConnectionFactory.java:258)
    at org.apache.ftpserver.command.impl.STOR.execute(STOR.java:133)
    at org.apache.ftpserver.impl.DefaultFtpHandler.messageReceived(DefaultFtpHandler.java:211)
    at org.apache.ftpserver.listener.nio.FtpHandlerAdapter.messageReceived(FtpHandlerAdapter.java:62)
    at org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.messageReceived(DefaultIoFilterChain.java:858)
    at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:542)
    at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:48)
    at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:947)
    at org.apache.ftpserver.listener.nio.FtpLoggingFilter.messageReceived(FtpLoggingFilter.java:85)
    at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:542)
    at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:48)
    at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:947)
    at org.apache.mina.core.filterchain.IoFilterEvent.fire(IoFilterEvent.java:74)
    at org.apache.mina.filter.logging.MdcInjectionFilter.filter(MdcInjectionFilter.java:135)
    at org.apache.mina.filter.util.CommonEventFilter.messageReceived(CommonEventFilter.java:70)
    at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:542)
    at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:48)
    at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:947)
    at org.apache.mina.filter.codec.ProtocolCodecFilter$ProtocolDecoderOutputImpl.flush(ProtocolCodecFilter.java:398)
    at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:234)
    at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:542)
    at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:48)
    at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:947)
    at org.apache.mina.core.filterchain.IoFilterEvent.fire(IoFilterEvent.java:74)
    at org.apache.mina.core.session.IoEvent.run(IoEvent.java:63)
    at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTask(OrderedThreadPoolExecutor.java:770)
    at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.runTasks(OrderedThreadPoolExecutor.java:762)
    at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.run(OrderedThreadPoolExecutor.java:704)
    at java.lang.Thread.run(Unknown Source)
[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - SENT: 150 File status okay; about to open data connection.

[pool-3-thread-1] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - SENT: 425 Can't open data connection.

[pool-3-thread-2] INFO org.apache.ftpserver.listener.nio.FtpLoggingFilter - CLOSED

Пожалуйста, помогите мне, я часами искал возможное решение. Я уже разрешил порт в брандмауэре Windows и пробовал другие подходы.

Спасибо вам всем.


person Syless    schedule 29.11.2018    source источник
comment
enterLocalActiveMode - ПОЧЕМУ?? Используйте пассивный режим.   -  person Martin Prikryl    schedule 29.11.2018
comment
Потому что я пытался использовать пассивный режим в первую очередь, а затем получил следующее сообщение об ошибке в моем приложении для носимых устройств: W/System.err: java.net.ConnectException: не удалось подключиться к /127.0.0.1 (порт 55185): Ошибка подключения: ECONNREFUSED (отказ в соединении) W/System.err: в libcore.io.IoBridge.connect(IoBridge.java:124) в java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183) в java.net.PlainSocketImpl .connect(PlainSocketImpl.java:452) Знаете ли вы, как это исправить?   -  person Syless    schedule 03.12.2018


Ответы (1)


Вероятность того, что активный режим будет работать на мобильном/носимом устройстве, практически нулевая. FTP в активном режиме требует разрешения входящих подключений к устройствам, что, в свою очередь, требует настройки брандмауэров и NAT на стороне клиента (или сети на стороне клиента). Как правило, приложение на мобильном устройстве находится за множеством таких брандмауэров и NAT (как на самом устройстве, так и в основном в сети операторов связи). И у вас нет (или мало) контроля над ними.

Вместо этого используйте пассивный режим.


Подробнее читайте в моей статье о конфигурации сети, необходимой для активного и пассивного режимов FTP.


Я знаю, что вы прокомментировали, что пассивный режим вам тоже не подходит. Но это не повод пробовать активный режим. Вы должны попытаться исправить пассивный режим (который, скорее всего, сработает), вместо того, чтобы тратить время на попытки исправить активный режим. Поэтому рассмотрите возможность публикации нового вопроса о пассивном режиме с конкретными сообщениями об ошибках и любой другой имеющейся у вас информацией об отладке.

person Martin Prikryl    schedule 03.12.2018