URL url=new URL("http://86516.onlinedown.net/down/FlashFXP_3.3.8.1133_RC2_SC.exe");
HttpURLConnection httpConnection = (HttpURLConnection)url.openConnection ();
返回的文件长度是错误的!按理说不管重定向不重定向,HttpURLConnection是可以自动完成的,但是这次却不行了,这是怎回事呢?

解决方案 »

  1.   

    /**
     * 获取文件的长度信息
     * @param address String 要获取的文件的地址
     * @return int 文件的长度
     */
    private int getFileLength(String address)
    {
    int length = 0;
    try
    {
    // setProxy();
    URL url = new URL(address);
    HttpURLConnection connection = (HttpURLConnection) url
    .openConnection();
    connection.setReadTimeout(5000);
    connection.setRequestProperty("User-Agent", "NetFox");
    int code = connection.getResponseCode();
    if (code == 401)
    {
    throw new Exception("Unauthorized!");
    }
    System.out.println("response code = " + code);
    String header;
    for (int i = 0;; i++)
    {
    header = connection.getHeaderFieldKey(i);
    // System.out.println(header);
    if (header != null && header.equalsIgnoreCase("Content-Length"))
    {
    length = Integer
    .parseInt(connection.getHeaderField(header));
    if (length == -1)
    throw new Exception(
    "The file's length isn't to be know!");
    else if (length == -2)
    throw new Exception("The file can't be acessed.");
    break;
    }
    }
    } catch (Exception e)
    {
    e.printStackTrace();
    }
    return length;
    }
      

  2.   

    你有没有看看你得到的那个“文件”的内容?是 exe 文件吗?恐怕,它并不是你想要的那个 exe 文件,而是一个让你“选择镜像站点”的 html 页面吧。人家的 web 服务器好像不是只要一个 URL 就行的,人家还需要在 HTTP header 里有一些东西,而你的 HttpURLConnection 并没有提供这些东西。
      

  3.   

    首先要搞清楚人家的 web 服务器需要 HTTP header 里埋哪些东西。这可以用 Tcp Monitor 或者类似的用于网络数据流分析的工具。把这个弄清楚后,下面就是具体怎么在 HTTP request 里把所需要的 header 埋进去。如果你用 HttpURLConnection 的话,有个 URLConnection.setContentHandlerFactory() 好像跟这个有关,楼主可以研究研究。我没使用过这个。如果是用 Socket 通信的话,倒简单了,因为那里每个字节都是你自己写、自己读的,只要你对 HTTP request、response 稍有了解就差不多了。