1 回答
TA贡献1813条经验 获得超2个赞
虽然我不熟悉 Android Emulator,但我假设您需要连接到 10.0.2.2 才能连接到模拟器主机。
在 FTP 被动模式下,服务器发回一个 IP 地址,FTP 客户端需要连接到该地址来传输文件(或目录列表)。当您的 FTP 服务器侦听 127.0.0.1 时,它会发回该 IP 地址。但是 127.0.0.1 指的是(模拟的)Android 主机,在您的 Android 代码上下文中。因此,“连接被拒绝”。
这与连接到 NAT 后的 FTP 服务器的常见问题非常相似。请参阅通过 NAT 在端口 2000 上运行的 FTP 服务器无法在被动模式下工作
因此解决方案是相同的:
在 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();
}
}
添加回答
举报