java - 已建立连接但没有互联网的 UnknownHostException 超时

标签 java android timeout connection connectivity

我有一个有趣的问题。

我在其中有一个应用程序,我试图解释手机连接到路由器但路由器未连接到互联网的情况。

我已经尝试了多种建立连接的方法,但没有一种超时可以解释这种情况。

我试过:

HttpParams httpParameters = new BasicHttpParams();
int timeoutSocket = 1000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutSocket);

我也试过:

HttpURLConnection huc = (HttpURLConnection)serverAddress.openConnection();

huc.setDoOutput(true);
huc.setRequestMethod("PUT"); // For amazon
//huc.setRequestMethod("POST"); // For regular server.
huc.setRequestProperty("Content-Type", "text/plain");
huc.setRequestProperty("Content-Length", String.valueOf(bytes));
huc.setFixedLengthStreamingMode(bytes);
huc.setConnectTimeout(1000); // Establishing connection timeout
huc.setReadTimeout(1000);

但在这两种情况下,当我执行/获取输出流时,大约需要 20 秒才能收到 UnknownHostException 错误。

我希望在得出结论之前将时间缩短到最多 5 秒。

有什么办法吗?

干杯

最佳答案

通过大量搜索和 this 的帮助链接 我已经找到了一个可靠的解决方案,到目前为止可以正常工作。

我对结论的理解是,当我使用如下方法时:

DataOutputStream wr = new DataOutputStream(huc.getOutputStream());

InputStream is = ucon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);

(上传或下载)

幕后发生了很多事情。包括 DNS 查找调用。在没有连接但连接到路由器的情况下,这大约需要 20 秒才能最终到达 UnknownHostException。

但是,如果我在执行上面的代码之前先添加这行代码:

InetAddress iAddr = InetAddress.getByName("myserverName.com");

然后它将给我正确的 SocketTimeOutException 并准确响应我希望/期望的方式。上面的代码行显然缓存了 DNS 查找,并且超时按预期工作。

另外,需要注意的是:一旦失败被缓存,执行上面的代码将花费与之前其他代码一样长的时间来失败。 (不能确切告诉你什么会触发这个)但是如果你再次连接到互联网,然后再次进入连接但没有连接状态,早期的成功将被缓存并且超时将再次正常工作。

这不是特别容易找到或弄清楚,所以我希望这对某人有所帮助。

干杯,

关于java - 已建立连接但没有互联网的 UnknownHostException 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13774480/

相关文章:

python - 具有长时间启动和 gunicorn 超时的应用程序

java - 将要素添加到 Geotools 中的现有图层

java - 如何在查看寻呼机中的图像顶部添加文本?

java - Java 在 Little Endian CPU 架构上运行时如何处理 Endianess?

android - 使用 ormlite 从 json 读取数据并将其保存在 android 应用程序中

java - 如何从 HttpURLConnection 实例获取 HTTP 请求字符串

java - JPA2.0中的@OneToOne单向映射——持久化时出现SQL错误

android - Android`s DisplayMetrics 类中的 scaledDensity 和 density 有什么区别?

apache - 安装 PPTP 后 HTTPS 连接超时

wcf - Web 服务超时的最佳实践