Search code examples
javaandroidftpapache-commons-net

"Connection is not open" FTP Android


Everytime I try to connect, I get the exception "Connection is not open". The server is working well when I try to access by FileZilla or browser.

I'm using the apache-common-net library.

private Boolean downloadAndSaveFile(String server, int portNumber,
                                    String user, String password, String filename, File localFile)
        throws IOException {
    FTPClient ftp = null;

    try {
        ftp = new FTPClient();
        ftp.connect(server, portNumber);

        ftp.login(user, password);

        ftp.setFileType(FTP.BINARY_FILE_TYPE);

        ftp.enterLocalPassiveMode();

        OutputStream outputStream = null;
        boolean success = false;
        try {
            outputStream = new BufferedOutputStream(new FileOutputStream(
                    localFile));
            success = ftp.retrieveFile(filename, outputStream);
        } finally {
            if (outputStream != null) {
                outputStream.close();
            }
        }

        return success;
    } finally {
        if (ftp != null) {
            ftp.logout();
            ftp.disconnect();
        }
    }
}

Implementation:

 private Boolean buttonDo(String atividade, int groupPosition, int childPosition)  {
    try {
        downloadAndSaveFile(servidor, porta, user, password, filename, filelocation);

    }catch (IOException e) {
        Toast.makeText(_context,e.getMessage(),Toast.LENGTH_SHORT).show();

    }
    return false;
}

Log:

java.io.IOException: Connection is not open
 at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:514)
 at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:648)
 at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:622)
 at org.apache.commons.net.ftp.FTP.quit(FTP.java:904)
 at org.apache.commons.net.ftp.FTPClient.logout(FTPClient.java:1148)
 at com.joaobernardos.joaobernardo.gave.ExpandableListAdapter.downloadAndSaveFile(ExpandableListAdapter.java:124)
 at com.joaobernardos.joaobernardo.gave.ExpandableListAdapter.buttonDo(ExpandableListAdapter.java:198)
 at com.joaobernardos.joaobernardo.gave.ExpandableListAdapter.access$200(ExpandableListAdapter.java:34)
 at com.joaobernardos.joaobernardo.gave.ExpandableListAdapter$1.onClick(ExpandableListAdapter.java:241)
 at android.view.View.performClick(View.java:4756)
 at android.view.View$PerformClick.run(View.java:19761)
 at android.os.Handler.handleCallback(Handler.java:739)
 at android.os.Handler.dispatchMessage(Handler.java:95)
 at android.os.Looper.loop(Looper.java:135)
 at android.app.ActivityThread.main(ActivityThread.java:5253)
 at java.lang.reflect.Method.invoke(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:372)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

So, I went to explore FTP.class and discovered what's causing the exception:

 public int sendCommand(String command, String args) throws IOException {
    if(this._controlOutput_ == null) {
        throw new IOException("Connection is not open");
    } else {
        String message = this.__buildMessage(command, args);
        this.__send(message);
        this.fireCommandSent(command, message);
        this.__getReply();
        return this._replyCode;
    }
}

I'm not using an Worker Thread. Should I? How can I implement it?


Solution

  • You are not getting the exception, when you "try to connect". You are getting it, when you are logging out.

    I'd guess that, what actually happens is, that the code in try block throws an exception, without actually connecting. You then try to logout in the finally block, what throws, because you never logged in.

    Remove the ftp.logout() and ftp.disconnect() to avoid swallowing a primary exception, to see when's your actual problem.

    As you are doing network stuff on GUI thread, it's quite likely, that it's the actual problem. The primary exception can be NetworkOnMainThreadExeption.
    See How to fix 'android.os.NetworkOnMainThreadException'?