使用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.
相关产品推荐
相关产品推荐

