Java FTPClient:获取"连接由同行重置"当调用getReply()时

时间:2015-02-23 14:25:06

标签: java android ftp ftp-client

我最近试图通过移动应用程序连接到FTP服务器。 我能够连接到我的服务器并检查它是否已连接(它是否已连接)。 接下来是使用被动模式设置的用户名和密码登录。我做的最后一件事是从服务器获取回复代码,但是当我的应用程序运行时,我的屏幕变黑了。当我重新打开我的应用程序时,它显示“recv failed:ECONNREST(由对等方重置连接)”作为我输出的错误消息。这是我的代码:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

    ftpClient = new FTPClient();
    textView = (TextView)findViewById(R.id.textView_id);
    textView2 = (TextView)findViewById(R.id.textView2_id);
    textView3 = (TextView)findViewById(R.id.textView3_id);
    textView4 = (TextView)findViewById(R.id.textView4_id);
    textView5 = (TextView)findViewById(R.id.textView5_id);

    try{
        ftpClient.connect(ip, port);
        boolean connectSucces = ftpClient.isConnected();
        ftpClient.login(userName,passWord);
        ftpClient.enterLocalPassiveMode();
        ftpClient.getReply();
        int connectionMode = ftpClient.getDataConnectionMode();
        if(connectionMode == ftpClient.PASSIVE_LOCAL_DATA_CONNECTION_MODE)    {
            textView.setText("Connected: " + connectSucces + " ConnectionMode: " + connectionMode);
        }
    }catch(Exception e){
        textView.setText(e.getMessage());
    }
}

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

我认为调用getReply()会导致代码死机。

您没有发送服务器应该回复的任何命令,因此客户端会等待响应,直到它或服务器超时。

后者可能发生了,这就是服务器关闭/重置连接的原因。

您通常不会自己致电getReply()。在大多数情况下,FTPClient为您内部调用它:

  

如果您要实现自己的FTP客户端,或者需要从FTP服务器获取辅助响应,请仅使用此方法。


虽然我没有Android开发经验,但从症状和代码来看,我假设您从GUI线程连接到FTP服务器,这是一种不好的做法。这可以解释为什么等待时屏幕会变空。