0

我正在我的应用程序中下载一个文件并使用以下超时。

HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, 5000);
HttpConnectionParams.setSoTimeout(httpParameters, 5000);

时不时地只下载部分文件。如果在慢速移动网络上没有在 5 秒内完成下载,5 秒的 setSoTimeout 可以停止下载吗?

从谷歌开发文档它说:

以毫秒为单位设置默认套接字超时 (SO_TIMEOUT),即等待数据的超时。

这是指等待第一个数据的时间,还是等待任何进一步数据的时间?IE 下载开始,但 5 秒内没有更多数据到达。

编辑 我做了一个测试,我将 SO_TIMEOUT 减少到 100 毫秒,但它对阻止下载仅在一秒钟后完成没有任何效果。

4

2 回答 2

1

如果在慢速移动网络上没有在 5 秒内完成下载,5 秒的 setSoTimeout 可以停止下载吗?

不,但如果任何特定的 read() 调用需要超过 5 秒来接收任何数据,它可能会抛出 SocketTimeoutException。当你得到那个例外时你会做什么取决于你。你可以重试。

如果您收到读取超时,则可能是发件人停止,网络出现故障,或者您的读取超时太短。5000 毫秒是一个非常短的超时。举起它,看看会发生什么。

于 2013-02-01T19:57:03.747 回答
-1

如果读取调用花费的时间比指定的时间长(在您的情况下为 5000 毫秒,此等待时间指的是从下载开始的时间),则根据文档设置SO_TIMEOUT将引发异常,这意味着异常将中断您的下载过程。java.net.SocketTimeoutException

使用指定的超时启用/禁用 SO_TIMEOUT,以毫秒为单位。将此选项设置为非零超时,对与此 Socket 关联的 InputStream 的 read() 调用将仅阻塞此时间量。如果超时到期,则会引发 java.net.SocketTimeoutException,尽管 Socket 仍然有效。必须在进入阻塞操作之前启用该选项才能生效。超时必须 > 0。超时为零被解释为无限超时。

于 2013-02-01T12:53:29.487 回答