A Simple Http Server with Java/Socket?
In addition to the \r\n
after every request header line, you have to send an empty line after the header. Example:
out.write("HTTP/1.0 200 OK\r\n");
// Header...
out.write("Last-modified: Fri, 09 Aug 1996 14:21:40 GMT\r\n");
out.write("\r\n"); // The content starts afters this empty line
out.write("<TITLE>Hello!</TITLE>");
// Content...
I corrected your code so that it works (but it is still not perfect, you should handle every request in a seperate thread, e.g. with java.util.concurrent.ThreadPoolExecutor
):
public static void main(String[] args) throws Exception {
// création de la socket
int port = 1989;
ServerSocket serverSocket = new ServerSocket(port);
System.err.println("Serveur lancé sur le port : " + port);
// repeatedly wait for connections, and process
while (true) {
// on reste bloqué sur l'attente d'une demande client
Socket clientSocket = serverSocket.accept();
System.err.println("Nouveau client connecté");
// on ouvre un flux de converation
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
// chaque fois qu'une donnée est lue sur le réseau on la renvoi sur
// le flux d'écriture.
// la donnée lue est donc retournée exactement au même client.
String s;
while ((s = in.readLine()) != null) {
System.out.println(s);
if (s.isEmpty()) {
break;
}
}
out.write("HTTP/1.0 200 OK\r\n");
out.write("Date: Fri, 31 Dec 1999 23:59:59 GMT\r\n");
out.write("Server: Apache/0.8.4\r\n");
out.write("Content-Type: text/html\r\n");
out.write("Content-Length: 59\r\n");
out.write("Expires: Sat, 01 Jan 2000 00:59:59 GMT\r\n");
out.write("Last-modified: Fri, 09 Aug 1996 14:21:40 GMT\r\n");
out.write("\r\n");
out.write("<TITLE>Exemple</TITLE>");
out.write("<P>Ceci est une page d'exemple.</P>");
// on ferme les flux.
System.err.println("Connexion avec le client terminée");
out.close();
in.close();
clientSocket.close();
}
}
This is an answer to your last question only and the reason that nothing is visible in the browser is because you calculated the number of characters incorrectly.
It should be 57 instead of 59.
Better yet is to have the number of characters calculated automatically but I believe that your sample is just a sample.