如何从服务器(在客户端 - 服务器应用程序中)创建循环读取/下载文件?

时间:2015-05-20 10:21:52

标签: java file-io while-loop client-server bufferedreader

在我的客户端 - 服务器应用程序中,客户端向服务器发送GET filename命令以下载文件。现在,客户端必须能够读取缓冲区大小(驻留在服务器中的文件)并将其下载到客户端。这是我在一个while循环中完成的。我关心的是客户端类中的循环: 循环是否正确?我正在阅读文件的方式......?

我想我应该在循环中指定filesize。然后如何完成或改进?

这是我正在处理的代码部分。

客户机侧:

 if (request.startsWith("GET")) {
                    File file = new File(request.substring(4));
                        is = socket.getInputStream();
                        fos = new FileOutputStream(file);

                        byte[] buffer = new byte[socket.getReceiveBufferSize()];
                        int bytesReceived = 0;
                        while ((bytesReceived = is.read(buffer)) >=0) {
                            //while ((bytesReceived = is.read(buffer))>=buffer) {
                            fos.write(buffer, 0, bytesReceived);
                        }
                        request = "";
                        fos.close();
                        is.close();


     }

服务器端:

  try (FileInputStream fis = new FileInputStream(file)) {
                            os = socket.getOutputStream();
                            byte[] buffer = new byte[(1 << 7) - 1];
                            int bytesRead = 0;

                            while ((bytesRead = fis.read(buffer)) != -1) {
                                os.write(buffer, 0, bytesRead);
                            }

                        }

1 个答案:

答案 0 :(得分:2)

如果这是HTTP协议的实现,则客户端可能不是服务器发送的文件大小。一种方法是服务器始终发送&#34; Content-Length&#34;标头和客户端读取此长度。更多信息HTTP规范:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html 另一种方法是客户端读取,直到服务器关闭连接。当服务器发送整个文件时,它会关闭连接。这不太可靠,因为网络问题可能导致连接中断。