Java 我的HTTP协议设计在编码中是否正确实现?
这是我非常简单的客户机-服务器应用程序。客户机向服务器发送一些命令,服务器将输出返回给客户机。但是,我特别关心的是发送到服务器的Java 我的HTTP协议设计在编码中是否正确实现?,java,http,file-io,http-headers,client-server,Java,Http,File Io,Http Headers,Client Server,这是我非常简单的客户机-服务器应用程序。客户机向服务器发送一些命令,服务器将输出返回给客户机。但是,我特别关心的是发送到服务器的GET命令。客户端请求获取文件名以下载命名文件。正如我设计的协议一样,该文件最终会下载到带有HTTP响应头的客户机目录中 现在我担心如果我的编码准确地遵循协议。特别是带有换行符的HTTP响应头(在客户端和服务器端) 协议设计: 客户: syntax: GET namedfile CRLF CRLF meaning: downloading the named file
GET
命令。客户端请求获取文件名以下载命名文件。正如我设计的协议一样,该文件最终会下载到带有HTTP响应头的客户机目录中
现在我担心如果我的编码准确地遵循协议。特别是带有换行符的HTTP响应头(在客户端和服务器端)
协议设计:
客户:
syntax: GET namedfile CRLF
CRLF
meaning: downloading the named file from the server
representation: text file
服务器:
syntax: Status: ok CRLF
Length: 20 bytes CRLF
CRLF
File contents
meaning: The file exist in the server and ready to
download
representation: text file
代码:
服务器端:
.................
.................
else if (request.startsWith("GET")) {
System.out.println("");
String filename = request.substring(4);
File file = new File(System.getProperty("user.dir"));
File[] files = file.listFiles();
if (fileExists(files, filename)) {
file = new File(filename);
int fileSize = (int) file.length();
outputToClient.print("Status OK\r\n"
+ "Size " + fileSize + "KB" + "\r\n"
+ "\r\n"
+ "File " + filename + " Download was successfully\r\n");
outputToClient.flush();
// reading files
fis = new FileInputStream(file);
os = socket.getOutputStream();
byte[] buffer = new byte[2^7-1];
int bytesRead = 0;
while ((bytesRead = fis.read(buffer))!= -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
fis.close();
} else {
outputToClient.print("Status 400\r\n"
+ "File " + filename + " not found\r\n"
+ "\r\n");
outputToClient.flush();
}
}
outputToClient.flush();
}
.................
.................
客户端:
............
............
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();
}
.................
.................
我不太清楚你在问什么,但正如john所指出的,为什么你不采用现有的解决方案,比如jetty server,并根据自己的喜好进行调整呢? 给出答案:例如,HTTP状态代码丢失。
直接“映射”到服务器文件系统不是最佳做法。重新发明轮子?更好的提问地点可能是codereview.Johnnnn,什么?问题应该问@john@Mast,所以这是重复的。好的,威尔。梅奥,非常感谢你。我想你明白我的意思了。你能给我一些更多的建议吗?你能告诉我具体的编码,状态码缺失的地方,以及更好的映射方式吗。请我会接受你的答案,并为你在论坛上发布的每一个答案投更多的赞成票。每个客户机请求至少包含本文中给出的最小示例。重要的响应标题字段包括状态(响应的第一行)、内容类型(您的浏览器需要知道将要进行的数据编码类型)和连接。剩下的就看你了。关于文件映射问题:您需要了解,可以通过GET/foo.html HTTP/1.1请求文件,但服务器可能会使用本地存储的文件bar.html进行响应。这样就隐藏了真正的文件结构。