【问题标题】:How to calculate the downloaded file size and total data to be downloaded如何计算下载的文件大小和要下载的总数据
【发布时间】:2016-11-30 13:19:38
【问题描述】:

如何使用socket计算下载的数据量和要下载的总数据量。

例如500kb/95000kb...95000kb/95000kb

这里我包含了我的代码供你参考。

private static void updateFile() {
    Socket socket = null;
    PrintWriter writer = null;
    BufferedInputStream inStream = null;
    BufferedOutputStream outStream = null;

    try {
        String serverName = System.getProperty("server.name");

        socket = new Socket(serverName, 80);
        writer = new PrintWriter(socket.getOutputStream(), true);
        inStream = new BufferedInputStream(socket.getInputStream());
        outStream = new BufferedOutputStream(new FileOutputStream(new File("XXX.txt")));

        // send an HTTP request
        System.out.println("Sending HTTP request to " + serverName);

        writer.println("GET /server/source/path/XXX.txt HTTP/1.1");
        writer.println("Host: " + serverName + ":80");
        writer.println("Connection: Close");
        writer.println();
        writer.println();

        // process response
        int len = 0;
        byte[] bBuf = new byte[8096];
        int count = 0;

        while ((len = inStream.read(bBuf)) > 0) {
            outStream.write(bBuf, 0, len);
            count += len;
        }
    }
    catch (Exception e) {
        System.out.println("Error in update(): " + e);
        throw new RuntimeException(e.toString());
    } 
    finally {
        if (writer != null) {
            writer.close();
        }
        if (outStream != null) {
            try { outStream.flush(); outStream.close(); } catch (IOException ignored) {ignored.printStackTrace();}
        }
        if (inStream != null) {
            try { inStream.close(); } catch (IOException ignored) {ignored.printStackTrace();}
        }
        if (socket != null) {
            try { socket.close(); } catch (IOException ignored) {ignored.printStackTrace();}
        }
    }
}

请建议实现这一目标,并提前致谢。

【问题讨论】:

  • 不可能直接。如果您尝试下载文件。我建议您使用 HttpURLConnection 之类的类并使用:connection.getContentLength() 来了解要下载的数据的总大小。使用套接字是可能的,但您首先需要内容的标题并获取示例“内容长度”的值
  • HTTP 中的行终止符是\r\n,而不是println() 给你的任何东西。当有内置支持和任意数量的第三方客户端时,不要自己实现 HTTP。这不是微不足道的。请参阅 RFC 2616 了解原因。

标签: java sockets stream file-transfer


【解决方案1】:

socket一般不知道接收数据的大小。套接字绑定到 TCP 连接,而 TCP 不提供有关数据大小的任何信息。这是应用程序协议的任务,在您的示例中是 HTTP。

HTTP 表示Content-Length 标头中的数据大小。 HTTP 响应如下所示:

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 13
Connection: keep-alive

<html></html>

HTML 响应包含标题和正文。正文与标题用换行符分隔。 Content-Length 标头包含正文的大小(以字节为单位)。

因此,您可以解析标头并找到长度,也可以使用现有的类,如 java.net.HttpURLConnection

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    相关资源
    最近更新 更多