当前位置: 首页 > 面试题库 >

从Android模拟器中的本地FTP服务器下载时出现错误“ 227进入被动模式” /“连接被拒绝”

衡丰茂
2023-03-14
问题内容

我正在尝试使用FTPSClientAndroid模拟器中运行的Java从本地FileZilla服务器下载文件。

我已经编写了此帮助程序代码来下载一个文件:

public boolean downloadSingleFile(FTPSClient ftpClient,
                                  String remoteFilePath, File downloadFile) {
    OutputStream outputStream;
    Log.i("t1", remoteFilePath + " - " + downloadFile.getAbsolutePath());
    try {
        outputStream = new BufferedOutputStream(new FileOutputStream(
                downloadFile));
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
        boolean retval = ftpClient.retrieveFile(remoteFilePath, outputStream);
        outputStream.flush();
        return retval;
    } catch (Exception e) {
        Log.e("dwFile", e.toString());
        Log.e("dwFile", ftpClient.getReplyString());
    } return false;
}

我这样称呼这个功能:

FTPSClient dwClient = new FTPSClient();
dwClient.addProtocolCommandListener(
    new PrintCommandListener(
    new PrintWriter(new OutputStreamWriter(System.out, "UTF-8")), true));
dwClient.setConnectTimeout(30 * 1000);
dwClient.connect(OmsSettingsFunctions.getFTPServer());
Log.i("dwDB", dwClient.getReplyString());
if (dwClient.login(FPTuser, FTPpass))  {
    Log.i("dwDB", dwClient.getReplyString());
    dwClient.enterLocalPassiveMode();
    File dwFile = new File(externalPath + "/Android/data/com.myapp/files/Documents/db.temp");
    if(!downloadSingleFile(dwClient, "/DBs/db.txt", dwFile)) {
        Log.e("dwDB", "Download could not finish (DB)");
        Log.e("dwDB", dwClient.getReplyString());
    }...

但我不断收到此错误:

I/System.out: 220-FileZilla Server version 0.9.41 beta
I/System.out: 220-written by Tim Kosse (Tim.Kosse@gmx.de)
              220 Please visit http://sourceforge.net/projects/filezilla/
I/System.out: AUTH TLS
D/EGL_emulation: eglMakeCurrent: 0xa209dd60: ver 3 0 (tinfo 0x9f652ff0)
D/EGL_emulation: eglMakeCurrent: 0xa209dd60: ver 3 0 (tinfo 0x9f652ff0)
I/System.out: 234 Using authentication type TLS
I/dwDB: 234 Using authentication type TLS
I/Permission: Readingpermission is granted
I/Permission: Writingpermission is granted
I/System.out: USER *******
I/System.out: 331 Password required for omstest
I/System.out: PASS *******
I/System.out: 230 Logged on
I/dwDB: 230 Logged on
I/t1: /DBs/db.txt - /storage/0FF0-280B/Android/data/com.myapp/files/Documents/db.temp
I/System.out: TYPE I
I/System.out: 200 Type set to I
I/System.out: PASV
I/System.out: 227 Entering Passive Mode (127,0,0,1,199,113)
E/dwFile: java.net.ConnectException: Connection refused
          227 Entering Passive Mode (127,0,0,1,199,113)
E/dwDB: Download could not finish (DB)
        227 Entering Passive Mode (127,0,0,1,199,113)

我已经尝试使用enterLocalActivemode()代替,enterLocalPassivmode()但没有帮助。FTP服务器是TLS强制的,并且在我的本地计算机上运行。我正在通过10.0.2.2(Android回送)连接到它。我怎样才能解决这个问题?


问题答案:

虽然我对Android Emulator不熟悉,但是我假设您需要连接到10.0.2.2才能连接到模拟器主机。

在FTP被动模式下,服务器发回FTP客户端需要连接到的IP地址以传输文件(或目录列表)。当您的FTP服务器侦听127.0.0.1时,它会发回该IP地址。但是在您的Android代码的上下文中,127.0.0.1是指(模拟的)Android主机。因此,“连接被拒绝”。

因此解决方案是相同的:

  • 在FileZilla服务器界面中,转到 编辑 >设置>被动模式设置>特定于IPv4>被动模式传输的外部服务器IP地址。并输入10.0.2.2。
  • 也许您还需要取消选中 “不要将外部IP用于本地连接”

显然,这又使FTP服务器无法用于普通客户端。

您已正确评论,仅当从Android模拟器连接到在模拟器主机上运行的FTP服务器时,才会出现此问题。

另一个解决方案是使用FTPClient.setPassiveNatWorkaroundStrategy。它接受HostnameResolver接口的实现。如果以某种方式将127.0.0.1转换为10.0.2.2,则即使服务器上没有任何更改,它也将允许Java代码进行连接。

public static class ServerResolverImpl implements HostnameResolver {
    private FTPClient client;

    public ServerResolverImpl(FTPClient client) {
        this.client = client;
    }

    @Override
    public String resolve(String hostname) throws UnknownHostException {
        return this.client.getRemoteAddress().getHostAddress();
    }
}


 类似资料:
  • 我已经实现了一个基于此Apache项目的FTP服务器:http://mina.apache.org/ftpserver-project/index.html 服务器旨在支持被动模式并进行相应配置。出于测试目的,我仅配置了一个被动端口(4244),但启动服务器后此端口上没有任何内容被监听。FTP服务器正在监听标准端口用于主动连接和SSL连接。 当尝试与FTP客户端连接时,我会收到以下错误(不足为奇)

  • 即使我在Android Studio之外运行模拟器,也会发生这种情况。我已经尝试了aa android6和android4.4的模拟器。在Windows 7 x64 PC上运行。与另一个已关闭的stackoverflow post类似。我尝试过各种ram、vm堆和分辨率设置。

  • 更新到Android Studio 2后,当我尝试运行应用程序并选择模拟器时,我等待模拟器启动,它突然被杀死。我可以看到模拟器进程几分钟,但从来没有看到GUI。在Android studio中,我发现了错误 即使我在Android Studio之外运行模拟器,也会发生这种情况。我试过Android 6和基于Android 4.4的模拟器。在Windows 7 x64 PC上运行。类似于另一个已关闭

  • 我试图在Android上模拟我的Ionic应用程序。一旦我的应用程序在仿真设备中启动,它就会中断,出现以下错误: 应用程序错误 网络::错误连接被拒绝(http://localhost:8100) 而且 在浏览器和iOS调试器中调试同一个项目就像一个符咒。 cordova插件白名单已经安装,我的配置中有以下规则。xml 任何帮助都将不胜感激。

  • 我刚刚编写了一个sprint引导应用程序来连接rabbitmq,并尝试发送一些测试消息,但连接被拒绝。Rabbitmq安装在docker中,该docker由命令<code>拉动。docker拉动Rabbitmq:3-management, 我用命令<;code>;docker run-d--hostname rabbit_test--name rabbitmq-p 15672:15672-p 56

  • 问题内容: 前几天,我的GoDaddy托管网站遇到了一些问题。我打电话给他们的技术支持,与我交谈的人建议我的问题与我在Windows机器上,最好在Linux机器上使用有关。我对此没有意见,我同意了,他们把我换了。 过渡之后,我的PHPMailer功能让我迷茫了。我已经工作了几个月,所以我知道我的设置是正确的。我已与GoDaddy确认,从他们的角度来看,我要发送的帐户并未更改。用户侧未进行任何更改(