我是android和java编程的新手。我编写以下代码来连接到ftp服务器
public class NewMainActivity extends Activity {
TextView Display;
//declare a public FTP client object.
public FTPClient mFTPClient = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_main);
final TextView Display = (TextView) findViewById(R.id.tvResults);
try {
mFTPClient = new FTPClient();
// connecting to the host
mFTPClient.connect("www.filegenie.com",21);
// now check the reply code, if positive mean connection success
if (FTPReply.isPositiveCompletion(mFTPClient.getReplyCode())) {
// login using username & password
boolean status = mFTPClient.login("user", "MyPassword");
// Set File Transfer Mode
mFTPClient.setFileType(FTP.BINARY_FILE_TYPE);
mFTPClient.enterLocalPassiveMode();
Display.setText("Correct"+ String.valueOf(status)); //return status;
}
}catch(Exception e) {
Display.setText(" Exception message is = "+e.getMessage()+" Reply code = "+mFTPClient.getReplyCode());
}
}
当我运行此代码时,我没有得到任何特定错误,但程序没有执行mFTPClient.connect方法并跳转到'Exception'部分,我得到“null”作为异常getMessage和“0”作为ReplyCode。 我已导入所有必需的文件,例如
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
我正在使用eclipse和ADT Build v22.0.1-685705。 我还在android项目的lib中包含了commons-net-3.3,commons-net-3.3-sources和commons-net-examples-3.3文件,还包括了来自java文件和文件夹的文件。 commons-net-3.3-src | src |主要| java |组织| apache |公地|通过创建文件夹org |将net文件夹添加到Android项目的src文件夹中apache |公地|净。 我无法弄清楚问题是什么。 任何人都可以在这方面帮助我。
可以使用商业ftp客户端访问同一台服务器。
提前致谢。
答案 0 :(得分:3)
我已经尝试过你的代码了,它运行正常。基于你得到的响应代码,我假设甚至没有建立与服务器的连接。确保您已在清单文件中为您的应用授予了INTERNET权限:
<uses-permission android:name="android.permission.INTERNET" />
编辑:从异常堆栈跟踪中可以清楚地看到,您正在尝试从主线程执行此代码。在Android 3.0(Honeycomb)或更高版本中,默认情况下不允许在UI线程中执行任何网络调用。原因很简单:网络呼叫可能会无限期地阻塞,有效地冻结了应用程序UI。 您有两种选择如何解决它:
懒惰方式 - 禁用网络通话检查:
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll()
.build();
StrictMode.setThreadPolicy(policy);
您始终可以使用
重新启用线程检查StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyLog()
.penaltyDeath()
.build();
StrictMode.setThreadPolicy(policy);
正确方法 - 使用AsyncTask从后台工作线程执行FTP调用。请查看here以获取有关AsyncTasks的示例和全面说明。