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();
}
}
添加回答
舉報
