使用FtpClient在Android中从FTP下载文件无法正常工作

时间:2015-03-18 12:14:38

标签: java android ftp server ftp-client

我正在尝试使用Android中的FTPClient从FTP下载文件。我能够成功登录到FTP但是当我运行下载代码时没有任何反应。在我的“downloads”文件夹中创建的文件是空白的0kb文件。

这是我的代码:

public class DownloadConfigFromFTP extends AsyncTask<String, Void, String> {
        private Context context;
        private ProgressDialog progressDialog;

        public DownloadConfigFromFTP(Context context) {
            this.context = context;
            this.progressDialog = new ProgressDialog(context);
            this.progressDialog.setCancelable(false);
            this.progressDialog.setMessage("Please wait...");
            this.progressDialog.show();

        }

        protected void onPreExecute() {
        }

        @Override
        protected String doInBackground(String... arg0) {
            String server = "serveraddress";
            int port = 21;
            String user = arg0[0];
            String pass = arg0[1];

            FTPClient ftpClient = new FTPClient();
            try {
                ftpClient.connect(server, port);
                ftpClient.login(user, pass);
                ftpClient.enterLocalPassiveMode();
                ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

                if (ftpClient.isConnected())
                    Log.d("status", "status: " + ftpClient.getStatus());


                String remoteFile1 = "config.txt";
                File downloadFile1 = new File(
                        Environment.getExternalStorageDirectory()
                                + "/downloads/config.txt");
                if (!downloadFile1.getParentFile().exists())
                    downloadFile1.getParentFile().mkdirs();
                OutputStream outputStream1 = new BufferedOutputStream(
                        new FileOutputStream(downloadFile1));
                boolean success = ftpClient.retrieveFile(remoteFile1,
                        outputStream1);
                outputStream1.close();

                if (success) {
                    Log.d(TAG, "Config file has been downloaded successfully.");
                } else {
                    Log.d(TAG, "Config file download failed.");
                }
            } catch (IOException ex) {
                System.out.println("Error: " + ex.getMessage());
                ex.printStackTrace();
            } finally {
                try {
                    if (ftpClient.isConnected()) {
                        ftpClient.logout();
                        ftpClient.disconnect();
                    }

                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }

            return null;
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }

        @Override
        protected void onPostExecute(String result) {
            if (this.progressDialog != null) {
                this.progressDialog.dismiss();
            }
        }
    }

代码不会超出界限:

  

ftpClient.retrieveFile(remoteFile1,outputStream1);

我检查了 REPLY CODE ,然后返回:211

我检查了服务器状态,然后返回:

03-18 18:43:06.787: D/status(7744): status: 211-FTP server status:
03-18 18:43:06.787: D/status(7744):      Connected to 101.xx.xx.xx
03-18 18:43:06.787: D/status(7744):      Logged in as username
03-18 18:43:06.787: D/status(7744):      TYPE: BINARY
03-18 18:43:06.787: D/status(7744):      No session bandwidth limit
03-18 18:43:06.787: D/status(7744):      Session timeout in seconds is 300
03-18 18:43:06.787: D/status(7744):      Control connection is plain text
03-18 18:43:06.787: D/status(7744):      Data connections will be plain text
03-18 18:43:06.787: D/status(7744):      At session startup, client count was 1
03-18 18:43:06.787: D/status(7744):      vsFTPd 2.3.5 - secure, fast, stable
03-18 18:43:06.787: D/status(7744): 211 End of status

经过漫长的等待后,我在Logcat中得到了这个:

03-19 10:31:12.755: W/System.err(25790): java.net.SocketException: recvfrom failed: ETIMEDOUT (Connection timed out)
03-19 10:31:12.929: W/System.err(25790):    at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:545)
03-19 10:31:12.931: W/System.err(25790):    at libcore.io.IoBridge.recvfrom(IoBridge.java:509)
03-19 10:31:12.931: W/System.err(25790):    at java.net.PlainSocketImpl.read(PlainSocketImpl.java:489)
03-19 10:31:12.932: W/System.err(25790):    at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
03-19 10:31:12.932: W/System.err(25790):    at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:241)
03-19 10:31:12.932: W/System.err(25790):    at java.io.InputStream.read(InputStream.java:162)
03-19 10:31:12.932: W/System.err(25790):    at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:142)
03-19 10:31:13.025: W/System.err(25790):    at java.io.BufferedInputStream.read(BufferedInputStream.java:227)
03-19 10:31:13.026: W/System.err(25790):    at java.io.PushbackInputStream.read(PushbackInputStream.java:146)
03-19 10:31:13.027: W/System.err(25790):    at org.apache.commons.net.io.FromNetASCIIInputStream.__read(FromNetASCIIInputStream.java:75)
03-19 10:31:13.027: W/System.err(25790):    at org.apache.commons.net.io.FromNetASCIIInputStream.read(FromNetASCIIInputStream.java:170)
03-19 10:31:13.031: W/System.err(25790):    at org.apache.commons.net.io.FromNetASCIIInputStream.read(FromNetASCIIInputStream.java:134)
03-19 10:31:13.061: W/System.err(25790):    at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:142)
03-19 10:31:13.066: W/System.err(25790):    at java.io.BufferedInputStream.read(BufferedInputStream.java:227)
03-19 10:31:13.072: W/System.err(25790):    at org.apache.commons.net.telnet.TelnetInputStream.__read(TelnetInputStream.java:114)
03-19 10:31:13.081: W/System.err(25790):    at org.apache.commons.net.telnet.TelnetInputStream.run(TelnetInputStream.java:535)
03-19 10:31:13.081: W/System.err(25790):    at java.lang.Thread.run(Thread.java:841)
03-19 10:31:13.081: W/System.err(25790): Caused by: libcore.io.ErrnoException: recvfrom failed: ETIMEDOUT (Connection timed out)
03-19 10:31:13.103: W/System.err(25790):    at libcore.io.Posix.recvfromBytes(Native Method)
03-19 10:31:13.104: W/System.err(25790):    at libcore.io.Posix.recvfrom(Posix.java:141)
03-19 10:31:13.104: W/System.err(25790):    at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:164)
03-19 10:31:13.106: W/System.err(25790):    at libcore.io.IoBridge.recvfrom(IoBridge.java:506)
03-19 10:31:13.106: W/System.err(25790):    ... 15 more
03-19 10:31:13.108: W/System.err(25790): java.net.SocketException: sendto failed: EPIPE (Broken pipe)
03-19 10:31:13.112: W/System.err(25790):    at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:499)
03-19 10:31:13.130: W/System.err(25790):    at libcore.io.IoBridge.sendto(IoBridge.java:468)
03-19 10:31:13.156: W/System.err(25790):    at java.net.PlainSocketImpl.write(PlainSocketImpl.java:508)
03-19 10:31:13.156: W/System.err(25790):    at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46)
03-19 10:31:13.156: W/System.err(25790):    at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:270)
03-19 10:31:13.159: W/System.err(25790):    at java.io.BufferedOutputStream.flushInternal(BufferedOutputStream.java:185)
03-19 10:31:13.159: W/System.err(25790):    at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:85)
03-19 10:31:13.160: W/System.err(25790):    at org.apache.commons.net.telnet.TelnetClient._flushOutputStream(TelnetClient.java:77)
03-19 10:31:13.160: W/System.err(25790):    at org.apache.commons.net.telnet.TelnetOutputStream.flush(TelnetOutputStream.java:137)
03-19 10:31:13.161: W/System.err(25790):    at java.io.FilterOutputStream.flush(FilterOutputStream.java:88)
03-19 10:31:13.161: W/System.err(25790):    at java.io.OutputStreamWriter.flushBytes(OutputStreamWriter.java:171)
03-19 10:31:13.213: W/System.err(25790):    at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:158)
03-19 10:31:13.243: W/System.err(25790):    at java.io.BufferedWriter.flush(BufferedWriter.java:124)
03-19 10:31:13.245: W/System.err(25790):    at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:442)
03-19 10:31:13.245: W/System.err(25790):    at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:520)
03-19 10:31:13.248: W/System.err(25790):    at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:569)
03-19 10:31:13.248: W/System.err(25790):    at org.apache.commons.net.ftp.FTP.quit(FTP.java:781)
03-19 10:31:13.248: W/System.err(25790):    at org.apache.commons.net.ftp.FTPClient.logout(FTPClient.java:706)
03-19 10:31:13.249: W/System.err(25790):    at com.avidishi.downloader.MainActivity$DownloadConfigFromFTP.doInBackground(MainActivity.java:168)
03-19 10:31:13.259: W/System.err(25790):    at com.avidishi.downloader.MainActivity$DownloadConfigFromFTP.doInBackground(MainActivity.java:1)
03-19 10:31:13.259: W/System.err(25790):    at android.os.AsyncTask$2.call(AsyncTask.java:288)
03-19 10:31:13.260: W/System.err(25790):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
03-19 10:31:13.261: W/System.err(25790):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
03-19 10:31:13.261: W/System.err(25790):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
03-19 10:31:13.263: W/System.err(25790):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
03-19 10:31:13.317: W/System.err(25790):    at java.lang.Thread.run(Thread.java:841)
03-19 10:31:13.338: W/System.err(25790): Caused by: libcore.io.ErrnoException: sendto failed: EPIPE (Broken pipe)
03-19 10:31:13.379: W/System.err(25790):    at libcore.io.Posix.sendtoBytes(Native Method)
03-19 10:31:13.380: W/System.err(25790):    at libcore.io.Posix.sendto(Posix.java:156)
03-19 10:31:13.415: W/System.err(25790):    at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177)
03-19 10:31:13.423: W/System.err(25790):    at libcore.io.IoBridge.sendto(IoBridge.java:466)
03-19 10:31:13.423: W/System.err(25790):    ... 24 more

我再试一次,我收到了这个错误:

03-19 10:51:25.873: I/System.out(12809): Error: failed to connect to ec2-54-214-84-134.us-west-2.compute.amazonaws.com/54.214.84.134 (port 21): connect failed: ETIMEDOUT (Connection timed out)
03-19 10:51:25.874: W/System.err(12809): java.net.ConnectException: failed to connect to ec2-54-214-84-134.us-west-2.compute.amazonaws.com/54.214.84.134 (port 21): connect failed: ETIMEDOUT (Connection timed out)
03-19 10:51:25.875: W/System.err(12809):    at libcore.io.IoBridge.connect(IoBridge.java:114)
03-19 10:51:25.875: W/System.err(12809):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
03-19 10:51:25.875: W/System.err(12809):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
03-19 10:51:25.875: W/System.err(12809):    at java.net.Socket.startupSocket(Socket.java:566)
03-19 10:51:25.876: W/System.err(12809):    at java.net.Socket.tryAllAddresses(Socket.java:128)
03-19 10:51:25.876: W/System.err(12809):    at java.net.Socket.<init>(Socket.java:178)
03-19 10:51:25.876: W/System.err(12809):    at java.net.Socket.<init>(Socket.java:150)
03-19 10:51:25.876: W/System.err(12809):    at org.apache.commons.net.DefaultSocketFactory.createSocket(DefaultSocketFactory.java:53)
03-19 10:51:25.877: W/System.err(12809):    at org.apache.commons.net.SocketClient.connect(SocketClient.java:162)
03-19 10:51:25.877: W/System.err(12809):    at com.avidishi.downloader.MainActivity$DownloadConfigFromFTP.doInBackground(MainActivity.java:96)
03-19 10:51:25.877: W/System.err(12809):    at com.avidishi.downloader.MainActivity$DownloadConfigFromFTP.doInBackground(MainActivity.java:1)
03-19 10:51:25.877: W/System.err(12809):    at android.os.AsyncTask$2.call(AsyncTask.java:288)
03-19 10:51:25.878: W/System.err(12809):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
03-19 10:51:25.878: W/System.err(12809):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
03-19 10:51:25.878: W/System.err(12809):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
03-19 10:51:25.878: W/System.err(12809):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
03-19 10:51:25.878: W/System.err(12809):    at java.lang.Thread.run(Thread.java:841)
03-19 10:51:25.878: W/System.err(12809): Caused by: libcore.io.ErrnoException: connect failed: ETIMEDOUT (Connection timed out)
03-19 10:51:25.879: W/System.err(12809):    at libcore.io.Posix.connect(Native Method)
03-19 10:51:25.880: W/System.err(12809):    at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)
03-19 10:51:25.880: W/System.err(12809):    at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
03-19 10:51:25.880: W/System.err(12809):    at libcore.io.IoBridge.connect(IoBridge.java:112)
03-19 10:51:25.881: W/System.err(12809):    ... 16 more

0 个答案:

没有答案
相关问题