Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何计算下载的文件大小和要下载的总数据_Java_Sockets_Stream_File Transfer - Fatal编程技术网

Java 如何计算下载的文件大小和要下载的总数据

Java 如何计算下载的文件大小和要下载的总数据,java,sockets,stream,file-transfer,Java,Sockets,Stream,File Transfer,如何使用socket计算下载的数据量和要下载的总数据量 例如500kb/95000kb…95000kb/95000kb 这里我包括了我的代码供您参考 private static void updateFile() { Socket socket = null; PrintWriter writer = null; BufferedInputStream inStream = null; BufferedOutputStream outStream = null;

如何使用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();}
        }
    }
}

请提供建议以实现此目标,并提前感谢

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

HTTP表示
内容长度
标题中的数据大小。HTTP响应如下所示:

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

<html></html>
HTTP/1.1200正常
内容类型:text/html;字符集=utf-8
内容长度:13
连接:保持活力
HTML响应包含标题和正文。正文与标题之间用换行符隔开。
内容长度
标题包含正文的大小(以字节为单位)


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

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