在我的客户端 - 服务器应用程序中,客户端向服务器发送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);
}
}
答案 0 :(得分:2)
如果这是HTTP协议的实现,则客户端可能不是服务器发送的文件大小。一种方法是服务器始终发送&#34; Content-Length&#34;标头和客户端读取此长度。更多信息HTTP规范:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html 另一种方法是客户端读取,直到服务器关闭连接。当服务器发送整个文件时,它会关闭连接。这不太可靠,因为网络问题可能导致连接中断。