我正在编写一个程序来从服务器下载非常大的文件(~2GB)。我编写的程序能够恢复部分完成的下载,
为了模拟糟糕的互联网连接,我在下载过程中将以太网线从路由器中拔出。不幸的是,这导致我的程序挂起以下调用:while((bytesRead = in.read(data)) > 0)
(其中 bytesRead 是一个 int,in 是从 HttpURLConnection 构建的 BufferedInputStream,而 data 是一个字节数组)。
我尝试通过在另一个线程上调用 in.close() 来“中断”调用,但直到互联网连接恢复(此时抛出异常),它才会生效。
有什么办法可以防止互联网连接中断而冻结我的程序吗?
我发现唯一可靠的方法是实例化Socket
as an InterruptibleChannel
,并对卡住的 IO 线程执行中断。 (顺便说一句,你不必使用带有 InterruptibleChannels 的异步 NIO 调用,阻塞 I/O 工作得很好,你只是有一个非常好的和统一的方式来踢卡住的交换)
虽然,看起来像URLConnection
不允许您连接自定义套接字工厂。
也许你应该调查一下Http客户端来自阿帕奇。
EDIT
以下是创建可中断套接字的方法。
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.nio.channels.SocketChannel;
final SocketAddress remoteAddr =
new InetSocketAddress(
serverAddress,
servicePort
);
final SocketChannel socketChannel = SocketChannel.open( );
socketChannel.connect( remoteAddr );
// Here java.io.Socket is obtained
Socket socket = socketChannel.socket( );
我没有 HttpClient 示例,但我知道您可以自定义套接字初始化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)