2

我有一个有趣的问题。

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

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

我试过了:

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 秒。

有没有办法做到这一点?

干杯

4

2 回答 2

2

通过大量搜索并通过链接的帮助,我找到了一个可靠的解决方案,到目前为止似乎可以工作。

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

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 查找,并且超时按预期工作。

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

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

干杯,

于 2012-12-10T23:32:54.673 回答
0

您可以实现一个限制为 5000 毫秒的 CountDownTimer,请参阅此http://dewful.com/?p=3

于 2012-12-08T04:30:26.867 回答