【问题标题】:Java ftpclient application doesn't connectJava ftpclient 应用程序无法连接
【发布时间】:2013-09-05 22:39:15
【问题描述】:

我是 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 方法并跳转到“异常”部分,我得到“null”作为异常 getMessage 和“0”作为回复代码。 我已经导入了所有必需的文件,例如

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 文件,还包含了来自 commons-net-3.3-src |源代码 |主要 |爪哇 |组织 |阿帕奇 |公地 |通过创建文件夹 org | 将 net 文件夹添加到 Android 项目的 src 文件夹中。阿帕奇 |公地 |网。 我无法弄清楚是什么问题。 任何人都可以在这方面帮助我。

可以使用商业 ftp 客户端访问同一服务器。

提前致谢。

【问题讨论】:

    标签: java android eclipse apache ftp-client


    【解决方案1】:

    我已经尝试过您的代码,它工作正常。根据您收到的响应代码,我假设甚至尚未建立与服务器的连接。确保您已在清单文件中为您的应用授予 INTERNET 权限:

    <uses-permission android:name="android.permission.INTERNET" /> 
    

    编辑: 从异常堆栈跟踪中可以清楚地看出,您正试图从主线程执行此代码。在 Android 3.0 (Honeycomb) 或更高版本中,默认情况下不允许在 UI 线程中执行任何网络调用。原因很简单:网络调用可能会无限期阻塞,从而有效地冻结应用程序 UI。 您有两种选择来解决它:

    Lazy way - 禁用网络调用的therad检查:

    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 的示例和全面说明。

    【讨论】:

    • 亲爱的,感谢您的回复,我已经尝试了 INTERNET 权限,但仍然无法正常工作。您需要对代码应用任何其他特殊设置吗?
    • @MudasserNaseer,是否可以获得异常类型和堆栈跟踪?
    • 我得到了以下堆栈跟踪,我不知道如何获取异常类型。第一部分:android.os.NetworkOnMainThreadException\n\tat android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)\n\tat java.net.InetAddress.lookupHostByName(InetAddress.java:385)\n\ tat java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)\n\tat java.net.InetAddress.getByName(InetAddress.java:289)\n\tat org.apache.commons.net.SocketClient.connect(SocketClient .java:203)\n\tat com.example.new_1.NewMainActivity.onCreate(NewMainActivity.java:27)\n\tat
    • 第 2 部分 android.app.Activity.performCreate(Activity.java:5104)\n\tat android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)\n\tat android.app .ActivityThread.performLaunchActivity(ActivityThread.java:2144)\n\tat android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)\n\tat android.app.ActivityThread.access$600(ActivityThread.java:141)\n \tat android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)\n\tat android.os.Handler.dispatchMessage(Handler.java:99)\n\tat android.os.Looper.loop(Looper. java:137)\n\tat
    • 第 3 部分 android.app.ActivityThread.main(ActivityThread.java:5041)\n\tat java.lang.reflect.Method.invokeNative(Native Method)\n\tat java.lang. reflect.Method.invoke(Method.java:511)\n\tat com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)\n\tat com.android.internal.os.ZygoteInit. main(ZygoteInit.java:560)\n\tat dalvik.system.NativeStart.main(Native Method)\n
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 2021-07-21
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多