You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用FTPClient连接FTP主机时遇‘Unable to resolve host’错误求助

Android FTP连接报错排查:Unable to resolve host no Address associated with hostname

问题描述

我用以下代码实现Android端FTP服务器连接并上传图片到指定文件夹:

val file = File(localFilePath)
val ftpClient = FTPClient()
ftpClient.connectTimeout = 100*1000
// ftpClient.connect(InetAddress.getByName(serverAddress))
ftpClient.connect(serverAddress)
ftpClient.login(userName, password)
ftpClient.enterLocalPassiveMode()
ftpClient.setFileType(FTP.BINARY_FILE_TYPE)
ftpClient.changeWorkingDirectory(folderPath)
val inputStream = FileInputStream(file)
success = ftpClient.storeFile(remoteFileName, inputStream)
inputStream.close()

目前遇到的问题是:在Android端运行时出现**"Unable to resolve host no Address associated with hostname"**错误,但通过WebClient却能正常连接服务器并完成图片推送,需要排查解决。

排查方案

1. 检查Android网络权限

Android 9及以上默认禁止明文HTTP/FTP请求,需确保配置正确的网络权限与安全策略:

  • 添加基础网络权限到AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  • 若使用明文FTP(非FTPS),创建res/xml/network_security_config.xml并配置允许明文流量:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">你的FTP服务器域名</domain>
    </domain-config>
</network-security-config>

然后在AndroidManifest.xml的application标签中引用该配置:

android:networkSecurityConfig="@xml/network_security_config"

2. 验证服务器地址解析

WebClient能正常连接说明系统层面域名解析正常,但应用内可能存在解析异常:

  • 手动解析域名,替换原代码中的serverAddress为IP地址测试:
val ipAddress = InetAddress.getByName("你的FTP域名").hostAddress
ftpClient.connect(ipAddress)

如果用IP能连接,说明是应用内DNS解析问题,可固定使用IP或手动做域名解析后再连接。

3. 确认网络环境一致性

  • 确保Android设备与WebClient使用同一网络环境(如同一WiFi),避免因网络隔离导致的解析失败。
  • 添加网络状态判断,提前拦截无网络场景:
val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkInfo = connectivityManager.activeNetworkInfo
if (networkInfo == null || !networkInfo.isConnected) {
    // 处理无网络情况
    return
}

4. 调整FTP客户端配置

  • 取消注释代码中InetAddress.getByName(serverAddress)的部分,手动获取InetAddress后再连接,避免FTPClient内部解析逻辑异常:
ftpClient.connect(InetAddress.getByName(serverAddress))
  • 若WebClient使用了系统代理,需为FTPClient手动配置代理:
val proxy = Proxy(Proxy.Type.HTTP, InetSocketAddress("代理地址", 端口))
ftpClient.setProxy(proxy)

5. 捕获详细异常日志

在代码中添加精细异常捕获,获取更具体的错误信息:

try {
    // 你的FTP连接与上传代码
} catch (e: UnknownHostException) {
    Log.e("FTP_ERROR", "域名解析失败: ${e.message}")
} catch (e: IOException) {
    Log.e("FTP_ERROR", "IO异常: ${e.message}")
} catch (e: Exception) {
    Log.e("FTP_ERROR", "其他异常: ${e.message}")
}

内容的提问来源于stack exchange,提问作者Code Learner.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 17:53:31