超时被错误的 ip 忽略

Timeout ignored with wrong ip

我正在开发 Android 应用程序(Java 8,apache.commons.net.ftp 3.6,最小值:API 24/目标:API 27)连接到 FTP 服务器,但我遇到了一个奇怪的问题:

如果我连接到 public 测试服务器之一(例如 speedtest.tele2.net)或直接连接到 IP 地址(例如 10.1.1.123),它工作正常。

如果我故意在 "normal" 地址中添加拼写错误(例如 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

如果您得到 "connection refused",则表示该 IP 地址实际上已被网络中的某些主机使用。如果该地址没有任何内容,您将收到更多类似 "no route to host".

的错误