【问题标题】:FTP connection javaFTP连接java
【发布时间】:2021-08-03 01:18:09
【问题描述】:

我正在尝试将文件上传到服务器。通过 FTP 将文件上传到服务器的方式是什么?

我写了这门课:

serverconnect.java:

import java.io.IOException;
import java.net.SocketException;
import org.apache.commons.net.SocketClient;
import org.apache.commons.net.ftp.FTPClient;


public class serverconnection
{

    public FTPClient connectftp() 
    {
        FTPClient ftp = null;
        try {
            ftp.connect("ftp://ftp.drivehq.com/");
            ftp.login("zule", "*****");
        //  ftp.changeWorkingDirectory("/public");
        //  ftp.makeDirectory("200");
        } catch (SocketException en) {
            // TODO Auto-generated catch block
            en.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return ftp;
    }
}

这是mainActivity(只有相关代码):

import android.view.View;
import android.view.View.OnClickListener;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.widget.Button;
import android.widget.TextView;
import java.io.IOException;
import java.net.SocketException;
import org.apache.commons.net.ftp.FTPClient;



public class MainActivity extends Activity implements OnClickListener {
    Button scan;
    String contents;
    String format;
    TextView contentstext;
    TextView formattext;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //----------------------FTP-------------
        serverconnection ftpconnect =new serverconnection();
        FTPClient ftp=ftpconnect.connectftp();
        scan=(Button)findViewById(R.id.scanbutton);
        .....

当我在手机上安装该应用程序时,我收到一个错误:“不幸的是,您的应用程序必须停止...”

新代码:

public class MainActivity extends Activity implements OnClickListener {
    Button scan;
    String contents;
    String format;
    TextView contentstext;
    TextView formattext;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //----------------------FTP-------------
        //serverconnection ftpconnect =new serverconnection();
        //SimpleFTP ftp=ftpconnect.connectftp();
        SimpleFTP ftp = new SimpleFTP();
        try {
            ftp.connect("market.bugs3.com", 21, "u884282808", "lionetwork1");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

新的logcat:

09-16 13:43:31.131: E/AndroidRuntime(1203): FATAL EXCEPTION: main
09-16 13:43:31.131: E/AndroidRuntime(1203): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.market/com.example.market.MainActivity}: android.os.NetworkOnMainThreadException
09-16 13:43:31.131: E/AndroidRuntime(1203):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at android.app.ActivityThread.access$600(ActivityThread.java:123)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at android.os.Looper.loop(Looper.java:137)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at android.app.ActivityThread.main(ActivityThread.java:4424)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at java.lang.reflect.Method.invokeNative(Native Method)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at java.lang.reflect.Method.invoke(Method.java:511)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at dalvik.system.NativeStart.main(Native Method)
09-16 13:43:31.131: E/AndroidRuntime(1203): Caused by: android.os.NetworkOnMainThreadException
09-16 13:43:31.131: E/AndroidRuntime(1203):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at java.net.InetAddress.getAllByName(InetAddress.java:220)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at java.net.Socket.tryAllAddresses(Socket.java:108)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at java.net.Socket.<init>(Socket.java:177)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at java.net.Socket.<init>(Socket.java:149)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at org.jibble.simpleftp.SimpleFTP.connect(SimpleFTP.java:68)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at com.example.market.MainActivity.onCreate(MainActivity.java:31)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at android.app.Activity.performCreate(Activity.java:4465)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
09-16 13:43:31.131: E/AndroidRuntime(1203):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
09-16 13:43:31.131: E/AndroidRuntime(1203):     ... 11 more

【问题讨论】:

  • 我没有堆栈跟踪,因为我没有在模拟器上运行应用程序,因为它没有互联网连接..也许有人看到这段代码的问题? (我知道问题是 ftp)
  • 谢谢,我将此检查添加到我的代码中,但它仍然没有解决我的问题
  • @ Reimeus ,我添加了“commons-net-2.0.jar”和“commons-net-ftp-2.0.jar”,哪个版本有关系? 1.4.1 还是 2.0?
  • 我添加了“commons-net-1.4.1.jar”并删除了“commons-net-2.0.jar”和“commons-net-ftp-2.0.jar”,我也有相同的问题:“不幸的是您的应用停止了......”,有人有其他解决方案吗?
  • 我在删除“commons-net-2.0.jar”和“commons-net-ftp-2.0.jar”并添加外部jar后添加了更新的logcat:“”commons-net-1.4.1 .jar"..希望它有助于理解问题

标签: java android


【解决方案1】:

注意:AsyncTask 类在 API 级别 30 中已弃用。请改用 java.util.concurrent

问题在于您试图在主线程上进行网络调用。这在 Android 3.0 或更高版本上是不允许的。

您应该通过在不同线程上调用 FTP 服务器来解决此问题。一个很好的方法是使用 AsyncTask:

private class FtpTask extends AsyncTask<Void, Void, FTPClient> {
     protected FTPClient doInBackground(Void... args) {
        serverconnection ftpconnect =new serverconnection();
        FTPClient ftp=ftpconnect.connectftp();
        return ftp;
     }

     protected void onPostExecute(FTPClient result) {
         Log.v("FTPTask","FTP connection complete");
         ftpClient = result;
         //Where ftpClient is a instance variable in the main activity
     }
 }

然后你可以在主线程中使用以下代码运行这个后台线程:

new FtpTask().execute();

编辑:

如果你想在不同的方法之间传递参数,你可以改变 AsyncTask&lt;Void, Void, Void&gt; 超类初始化。

例如AsyncTask&lt;String, Double, Integer&gt;可以将String变量传递给doInBackground方法,使用双精度跟踪进度并使用整数作为结果类型(结果类型是doInBackground的返回类型,这将作为参数发送到 onPostExecute)。

【讨论】:

  • 感谢您的回答,我使用您编写的代码创建了一个名为“FtpTask”的新任务......但是它给我写了这个错误:“FtpTask 类型必须实现继承的抽象方法 AsyncTask .doInBackground(Void...)”,我该如何解决?
  • 非常感谢!!,该应用程序为我工作而不会引发错误...但是我需要做的一项更改是从“私有类 FtpTask 扩展 AsyncTask”中删除私有,我也怎么能从“new FtpTask().execute();”接收 ftp?再次感谢
  • 您可以通过将 FtpTask 类的结果类型设置为 FTPClient 来做到这一点,如下所示:AsyncTask&lt;Void, Void, FTPClient&gt;。然后在 onPostExecute 中,您可以将其返回到您的主要活动中。 (最好将 FtpTask 设为主 Activity 的内部类,这样它就可以访问主 Activity 的字段和属性)
  • 我不明白你...你能用更新的功能编辑你的答案吗?提前谢谢
  • 嗨,我将 MainActivity 编辑为:“SimpleFTP ftpclient=newFtpTask().execute();”并在 FtpTask.java 中更改为:“protected void onPostExecute(FTPClient result) { Log.v("FTPTask","FTP connection complete"); ftpclient = result; }" 但是在 FtpTask 中无法识别 ftpclient。 java 文件,所以它说我需要创建一个 FtpClient 本地变量,我不确定我是否完全理解你
猜你喜欢
  • 1970-01-01
  • 2015-03-23
  • 2011-12-22
  • 2016-03-04
  • 2011-05-28
  • 1970-01-01
  • 2014-03-18
  • 2011-08-20
  • 1970-01-01
相关资源
最近更新 更多