Я не могу подключиться к хосту моего FTP-сервера с помощью FTPClient в Java-Android

Введение

Привет,

Для проекта я должен подключить устройство Android к FTP-серверу (порт: 21).

После исследования я нашел пакет для разрешения соединения между устройством Android и FTP-сервером.

Поэтому я последовал примеру, найденному в Интернете, и создал свой FTP-сервер на своем Raspberry Pi в той же сети, что и мое устройство.

Но мое приложение не может подключиться к нему. Как показано на этом скриншоте приложения:

Я не могу подключиться к хосту моего FTP-сервера с помощью FTPClient в Java-Android

Исследование для попытки решить проблему

  • Сначала я пытался использовать easyFTP с другим пакетом, но у меня была та же проблема.

  • После поставил перед IP адресом сервера ftp:// но безуспешно.

  • Я попытался подключиться к своему FTP-серверу с помощью программного обеспечения Filezilla с моим персональным компьютером, и это работает.

Я не могу подключиться к хосту моего FTP-сервера с помощью FTPClient в Java-Android

Код

FTPModel.java

package com.example.erwan.ftplearn;

import android.util.Log;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.commons.net.ftp.FTPSClient;

import java.io.IOException;
import java.net.InetAddress;

public class FTPModel {
    public FTPClient mFTPClient = null;

    public boolean connect(String host, String username, String password, int port)
    {
        try {
            
            mFTPClient = new FTPClient();
            // connecting to the host
            mFTPClient.connect(host, port);

            // now check the reply code, if positive mean connection success
            boolean status = mFTPClient.login(username, password);

            mFTPClient.setFileType(FTP.BINARY_FILE_TYPE);
            mFTPClient.enterLocalPassiveMode();
            return status;

        } catch (Exception e) {
            Log.i("testConnection", "Error: could not connect to host " + host);

        }
        return false;
    }
}

MainActivity.java

package com.example.erwan.ftplearn;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import com.adeel.library.easyFTP;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FTPModel mymodel = new FTPModel();
        boolean co = mymodel.connect("192.168.1.25", "xxxxx", "xxxxx", 21);

        TextView statut = findViewById(R.id.connexionstatut);
        if (co)
        {
            statut.setText("Connecter !");
        }
        else
        {
            statut.setText("Erreur de connexion !");
        }


    }
}

Выход

2019-04-06 19:26:31.876 16869-16869/? I/testConnection: Error: could not connect to host 192.168.1.25
Caused by: android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1460)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:356)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:201)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:183)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356)
        at java.net.Socket.connect(Socket.java:616)
        at org.apache.commons.net.SocketClient.connect(SocketClient.java:182)
        at org.apache.commons.net.SocketClient.connect(SocketClient.java:203)
        at com.example.erwan.ftplearn.FTPModel.connect(FTPModel.java:21)
        at com.example.erwan.ftplearn.MainActivity.onCreate(MainActivity.java:22)
        at android.app.Activity.performCreate(Activity.java:7383)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1218)

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

Я почти уверен, что ваш код получает NetworkOnMainThreadException --- Но вы даже не регистрируете полученное исключение, так как же вы ожидали отладить проблему?

Martin Prikryl 07.04.2019 07:25

Я не видел эту ошибку, и когда я хотел получить сообщение об исключении, у меня есть NullPointerException. Только после того, как я увидел весь журнал, я нашел NetworkOnMainThreadException с другом.

Le codeur Etudiant 07.04.2019 14:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
2 031
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел проблему! Соединение на FTP-сервере должно выполняться в асинхронной задаче!

FTPClient не любит работать в основном потоке, поэтому мы должны работать в другом потоке.

package com.example.erwan.ftplearn;

import android.os.AsyncTask;
import android.util.Log;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.commons.net.ftp.FTPSClient;

import java.io.IOException;
import java.net.InetAddress;

public class FTPModel {
    public FTPClient mFTPClient = null;

    public boolean connect(String host, String username, String password, int port)
    {
        try
        {
            return new asyncConnexion(host, username, password, port).execute().get();
        }
        catch (Exception e)
        {
            return false;
        }
    }

    public class asyncConnexion extends AsyncTask<Void, Void, Boolean>
    {
        private String host;
        private String username;
        private String password;
        private int port;

        asyncConnexion(String host, String username, String password, int port)
        {
            this.host = host;
            this.password = password;
            this.port = port;
            this.username = username;
        }


        @Override
        protected Boolean doInBackground(Void... voids) {
            try {

                mFTPClient = new FTPClient();
                // connecting to the host
                mFTPClient.connect(host, port);

                // now check the reply code, if positive mean connection success
                boolean status = mFTPClient.login(username, password);

                mFTPClient.setFileType(FTP.BINARY_FILE_TYPE);
                mFTPClient.enterLocalPassiveMode();
                return status;

            } catch (Exception e) {
                Log.i("testConnection", "Error: could not connect to host " + host);
                e.printStackTrace();

            }
            return false;
        }
    }
}

Другие вопросы по теме