Http Range请求属性?

时间:2016-11-04 08:34:30

标签: java multithreading http download

我很难写一些试图通过远程主机的目标文件下载的java代码片段。我希望通过一些依赖于多线程进程的块来下载远程文件。

根据以下调试跟踪,一切运行良好:

Task 2 --> REQUEST PROPERTIES =  {Range=[bytes=59124782-88687172]}
Task 3 --> REQUEST PROPERTIES =  {Range=[bytes=88687173-118249563]}
Task 0 --> REQUEST PROPERTIES =  {Range=[bytes=0-29562390]}
Task 1 --> REQUEST PROPERTIES =  {Range=[bytes=29562391-59124781]}
Task 2 --> RETURN_CODE = 206 ==> OK :-) !
Task 2 --> Start Byte = 59124782 / End Byte = 88687172 --> Total bytes = 29562391
Task 0 --> RETURN_CODE = 206 ==> OK :-) !
Task 0 --> Start Byte = 0 / End Byte = 29562390 --> Total bytes = 29562391
Task 3 --> RETURN_CODE = 206 ==> OK :-) !
Task 3 --> Start Byte = 88687173 / End Byte = 118249563 --> Total bytes = 29562391
Task 1 --> RETURN_CODE = 206 ==> OK :-) !
Task 1 --> Start Byte = 29562391 / End Byte = 59124781 --> Total bytes = 29562391

根据以下调试跟踪,所有内容都运行良好:

Task 0 --> REQUEST PROPERTIES =  {Range=[bytes=0-15308169]}
Task 3 --> REQUEST PROPERTIES =  {Range=[bytes=45924510-61232679]}
Task 1 --> REQUEST PROPERTIES =  {Range=[bytes=15308170-30616339]}
Task 2 --> REQUEST PROPERTIES =  {Range=[bytes=30616340-45924509]}
Task 0 --> RETURN_CODE = 206 ==> OK :-) !
Task 0 --> Start Byte = 0 / End Byte = 15308169 --> Total bytes = 15308170
Task 3 --> RETURN_CODE = 200 ==> NOK :-( !
Task 2 --> RETURN_CODE = 200 ==> NOK :-( !
Task 1 --> RETURN_CODE = 200 ==> NOK :-( !

Trick是在两次运行之间代码是相同的,远程主机是相同的...只有目标文件不相同(第二个比第一个小一半,都是.zip文件)。 当请求某个定义的范围时,我期望每个任务206返回代码将接收确认的部分数据。但依靠第二条跟踪我得到3个最新的任务200代码什么意思服务器响应是好的但将发送完整文件:-( ....

什么黑魔法之王可能导致这样的????。谷歌搜索了一下我发现一些http服务器可能会引入一些范围请求合并过程......这种情况可能会发生在这里吗?

  

当请求多个范围时,服务器可以合并任何一个          重叠的范围,或由较小的间隙分隔的范围          比发送多个部分的开销,无论顺序如何          其中相应的字节范围规格出现在收到的          范围标题字段。由于部分之间的典型开销          multipart / byteranges有效载荷大约为80字节,具体取决于          选定的表示媒体类型和选定的边界          参数长度,转移许多小的效率可能较低          不相交的部分比转移整个选定的部分          表示。

仅供参考,这是我的java代码:

HttpURLConnection urlConn = null;
try {
    urlConn = task.openConnection(task.getSourceFileUrl());
    urlConn.setRequestMethod("GET");
    urlConn.setRequestProperty("Range", "bytes=" + currentByte + "-" + endByte + "");

    System.out.println(String.format("Task %s --> REQUEST PROPERTIES =  %s", id, urlConn.getRequestProperties().toString()));

    if (urlConn.getResponseCode() != HttpURLConnection.HTTP_PARTIAL) {
        System.out.println(String.format("Task %s --> RETURN_CODE = %s ==> NOK :-( !", id, urlConn.getResponseCode()));
        return;
    } else {
        System.out.println(String.format("Task %s --> RETURN_CODE = %s ==> OK :-) !", id, urlConn.getResponseCode()));
    }

    System.out.println(String.format("Task %s --> Start Byte = %s / End Byte = %s --> Total bytes = %s", id, currentByte, endByte, urlConn.getContentLengthLong()));

寻求帮助!!!!!

0 个答案:

没有答案