2017-04-20 138 views
2

每次嘗試連接時,都會收到「連接未打開」異常。當我嘗試通過FileZilla或瀏覽器訪問時,服務器運行良好。「連接未打開」FTP Android

我正在使用apache-common-net庫。

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(); 
     } 
    } 
} 

實現:

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; 
} 

登錄:

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) 

所以,我去探索FTP.class,發現是什麼導致了異常:

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; 
    } 
} 

我m不使用工作線程。我是不是該?我怎樣才能實現它?

+0

''「連接未打開」'。這是你自己的信息。你自己的例外。沒有意義提到這一點。最好告訴我們你發生了什麼事。 – greenapps

+0

您也將擁有一個NetworkOnMainThreadExeption。你應該把所有的ftp代碼放在一個線程或AsyncTask中。 – greenapps

+0

@greenapps這不是OP自己的信息。它是Apache Commons Net的例外。 –

回答

4

你沒有得到例外,當你「試圖連接」。當你註銷時,你會得到它。

我猜想,實際情況是try塊中的代碼會引發異常,但實際上沒有連接。然後,您嘗試在finally塊,什麼拋出註銷,因爲你永遠不登錄。

取出ftp.logout()ftp.disconnect()避免吞嚥主要的例外,看的時候是你的實際問題。

正如你在GUI線程上做網絡的東西,很可能這是真正的問題。主要的例外可以是NetworkOnMainThreadExeption
請參閱How do I fix android.os.NetworkOnMainThreadException?

+0

這是我的問題。謝謝 – JotaB

-1

確保您發送正確的端口號。請檢查它與服務器管理。這是沒有必要,端口是22一段時間不同的端口號可能設置爲FTP

+1

沒有證據表明這是問題。 –