Я пытаюсь реализовать простой сервер с использованием Java сокетов. Сервер должен вернуть сообщение HTTP Request, которое отправляет клиент. Таким образом, если я введу http://localhost: 8888 в свой браузер, я ожидаю увидеть сообщение HTTP-запроса, которое я отправил в виде простого текста на веб-странице. Кажется, что код выполняет то, что я ожидаю, поскольку браузер отображает сообщение http, которое совпадает с тем, что выводится в cmd при запуске программы.
Есть некоторые части моего кода Хотя мне интересно, например:
out.writeBytes("HTTP/1.0 200 OK\r\n"); out.writeBytes("\r\n");
перед моими данными. Достаточно ли этого, чтобы быть действительным ответом HTTP?
Есть ли в моем коде что-то еще, что, кажется, не имеет смысла или может быть улучшено?
Вот полная программа, которая выполняется в cmd командой "java HTTPEcho 8888 "например, и проверил, введя localhost: 8888 в вашем браузере, и все, что напечатано в cmd, должно быть таким же, как в браузере.
import java.net.*;
import java.io.*;
public class HTTPEcho {
public static void main( String[] args) throws IOException {
if (args.length != 1) {
System.err.println("Usage: java HTTPEcho <port number>");
System.exit(1);
}
int port = Integer.parseInt(args[0]);
try (
ServerSocket welcomeSocket = new ServerSocket(port);
Socket connectionSocket = welcomeSocket.accept();
DataOutputStream out = new DataOutputStream(connectionSocket.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
){
// echo back http request message as response to web browser client
out.writeBytes("HTTP/1.0 200 OK\r\n");
out.writeBytes("\r\n");
String s;
while ((s = in.readLine()) != null){
System.out.println(s);
out.writeBytes(s + "\r\n");
if(s.isEmpty()){
break;
}
}
out.close();
in.close();
connectionSocket.close();
} catch (IOException e) {
System.out.println("Exception caught when trying to listen on port "
+ port + " or listening for a connection");
System.out.println(e.getMessage());
}
}
}