我正在尝试使用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