Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.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 我的HTTP协议设计在编码中是否正确实现?_Java_Http_File Io_Http Headers_Client Server - Fatal编程技术网

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进行响应。这样就隐藏了真正的文件结构。