Java FTPClient:调用 getReply() 时获取 "Connection reset by peer"

Java FTPClient: Getting "Connection reset by peer" when calling getReply()

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

@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());
    }
}

我是不是漏掉了什么?

我认为是对 getReply() 的调用使您的代码陷入僵局。

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

后者可能发生了,这就是服务器 closed/reset 连接的原因。

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

Only use this method if you are implementing your own FTP client or if you need to fetch a secondary response from the FTP server.


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