java - 错误的 ip 忽略超时
问题描述
我正在开发一个连接到 FTP 服务器的 Android 应用程序(Java 8,apache.commons.net.ftp 3.6,Min:API 24/target:API 27),但我遇到了一个奇怪的问题:
如果我直接连接到公共测试服务器之一(例如speedtest.tele2.net
)或 IP 地址(例如10.1.1.123
),它工作正常。
如果我故意在“正常”地址中添加拼写错误(例如sspeedtest.tele2.net
),我会得到预期的结果java.net.UnknownHostException
,但是如果我在 IP 地址中添加拼写错误,无论它是否在同一个网络中(例如10.1.1.223
),都不会发生其他任何事情 -没有异常,没有错误,没有结果,即使在设置的超时时间过去之后。
代码:
FTPClient f = new FTPClient();
f.setDefaultTimeout(5000); //5 seconds
try {
f.connect(url,port);
boolean b = f.login(username,password);
Log.d(TAG,"logged in="+b+", connected="+f.isConnected());
} catch (IOException e) {
e.printStackTrace();
}
我让它运行了一点时间,最后,在 1 分 16 秒后抛出了一个异常:
W/System.err: java.net.ConnectException: Connection refused
我已经尝试过多次,但似乎总是在 1:16 之后抛出异常。
我如何使这方面也成为默认超时?我必须使用其他的吗?
解决方案
您正在设置接收数据的超时时间。打开连接的超时时间是单独的,并使用setConnectTimeout(int connectTimeout)
方法设置:
FTPClient f = new FTPClient();
f.setConnectTimeout(5000); // 5 second timeout to open connection
f.setDefaultTimeout(5000); // 5 second timeout when receiving data
如果您收到“连接被拒绝”,则表示该 IP 地址实际上已被网络中的某些主机使用。如果该地址没有任何内容,您将收到更多类似于“没有到主机的路由”的错误。
推荐阅读
- vba - VBA:自定义右键单击菜单选项不可见
- google-cloud-dataflow - JdbcIO 或自定义接收器以使用特定的数据库批量实用程序
- javascript - 停止图像的滚动
- gradle - 添加了凭据,现在找不到参数的方法 pluginRepositories()
- apache - 将子域重写到文件夹后避免内容重复
- sql - 如何在oracle sql中提取特定值
- c# - .NET Web Api 相同的 http 动词,不同的命名方法
- php - 如何在 Laravel 5.6 中使用一个字母正则表达式验证数字?
- excel - 使用 VLOOKUP 和 SUMIF 处理未决交易和已发布交易
- python - Discord bot 添加对消息 discord.py 的反应(无自定义表情符号)