Я работаю над своим первым домашним проектом в классе веб-программирования, который должен написать простой веб-сервер на Java. Я нахожусь в точке, где данные передаются туда и обратно, и на неопытный взгляд мой детский сервер работает нормально. Однако я не могу найти способ отправить соответствующие ответы. (Другими словами, недопустимый запрос страницы покажет HTML-страницу с ошибкой 404, но все равно возвращает статус 200 OK, когда я просматриваю заголовки ответов).
Я ограничен возможностью использовать стандартные сетевые библиотеки для управления сокетами и стандартные библиотеки ввода-вывода для чтения и записи байтов и строк из входного потока. Вот соответствующий код:
Из моего основного...
ServerSocket servSocket = new ServerSocket(port, 10); // Bind the socket to the port
System.out.println("Opened port " + port + " successfully!");
while(true) {
//Accept the incoming socket, which means that the server process will
//wait until the client connects, then prepare to handle client commands
Socket newDataSocket = servSocket.accept();
System.out.println("Client socket created and connected to server socket...");
handleClient(newDataSocket); //Call handleClient method
}
Из метода handleClient... (внутри цикла, который анализирует метод и путь запроса)
if(checkURL.compareTo("/status") == 0) { // Check to see if status page has been requested
System.out.println("STATUS PAGE"); // TEMPORARY. JUST TO MAKE SURE WE ARE PROPERLY ACCESSING STATUS PAGE
sendFile("/status.html", dataStream);
}
else {
sendFile(checkURL, dataStream); // If not status, just try the input as a file name
}
Из метода sendFile...
File f = new File(where); // Create the file object
if(f.exists() == true) { // Test if the file even exists so we can handle a 404 if not.
DataInputStream din;
try {
din = new DataInputStream(new FileInputStream(f));
int len = (int) f.length(); // Gets length of file in bytes
byte[] buf = new byte[len];
din.readFully(buf);
writer.write("HTTP/1.1 200 OK\r\n"); // Return status code for OK (200)
writer.write("Content-Length: " + len + "\r\n"); // WAS WRITING TO THE WRONG STREAM BEFORE!
writer.write("Content-Type: "+type+"\r\n\r\n\r\n"); // TODO VERIFY NEW CONTENT-TYPE CODE
out.write(buf); // Writes the FILE contents to the client
out.flush();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace(); // Not really handled since that's not part of project spec, strictly for debug.
}
}
else {
writer.write("HTTP/1.1 404 Not Found\r\n"); // Attempting to handle 404 as simple as possible.
writer.write("Content-Type: text/html\r\n\r\n\r\n");
sendFile("/404.html", sock);
}
Кто-нибудь может объяснить, как в условном из sendFile я могу изменить ответ в блоке 404 (как я уже говорил, заголовки ответов по-прежнему показывают 200 OK)? Это выводит меня из себя, и я просто хочу использовать класс HTTPResponse, но не могу. (Кроме того, длина и тип содержимого не отображаются, если f.exists == true.)
Спасибо!