在我的客户端服务器应用程序中,客户端将GET filename
命令发送到服务器以下载文件。现在,客户端必须能够读取(服务器中的文件的文件)并将其下载到客户端中。那就是我在循环内完成的。我关心的是客户班级中的循环:循环正确吗?我阅读文件的方式...?
我认为我应该在循环内指定文件大小。那如何完成或改进?
这是我正在处理的代码的一部分。
客户端:
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);
}
}
如果这是HTTP协议的实现,则客户端可能不是由服务器发送的文件大小。一种方法是服务器始终发送" content-Length"标头,客户端读取到此长度。添加信息http规范:http://www.w3.org/protocols/rfc2616/rfc2616/rfc2616-sec14.html另一种方法是读取,直到服务器关闭连接为止。当服务器发送整个文件时,它会关闭连接。这不是很可靠,因为由于网络问题而可能会删除连接。