首页 > 解决方案 > 错误的 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 之后抛出异常。

我如何使这方面也成为默认超时?我必须使用其他的吗?

标签: javaandroidftpapache-commons-net

解决方案


您正在设置接收数据的超时时间。打开连接的超时时间是单独的,并使用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 地址实际上已被网络中的某些主机使用。如果该地址没有任何内容,您将收到更多类似于“没有到主机的路由”的错误。


推荐阅读