Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

A Simple Http Server with Java/Socket?

Tags:

java

http

sockets

I am currently creating a small HTTP server that returns a static page <p>Hello!</p>... I tried with sockets with Java:

  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())                           );              PrintWriter out = new PrintWriter(                          new BufferedWriter(                             new OutputStreamWriter(clientSocket.getOutputStream())),                           true);                 // 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);          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 code does not contain any errors and I got a response from the browser like this:

GET / HTTP/1.1 Host: localhost:1989 Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.46 Safari/536.5 Comodo_Dragon/19.0.3.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding: gzip,deflate,sdch Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

But my problem is that I get no page at the Browser? Any help please?

PS: I already read this article: http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol , (im sorry for the french language...)

like image 558
Marwen Trabelsi Avatar asked May 28 '12 17:05

Marwen Trabelsi


People also ask

Does an HTTP server use sockets?

An HTTP server is a listening socket that rapidly accepts incoming requests and opens new sockets to handle those requests. The connection socket returns an HTTP response, and closes the connection.

What is server socket in java with example?

ServerSocket Class is used for providing system-independent implementation of the server-side of a client/server Socket Connection. The constructor for ServerSocket throws an exception if it can't listen on the specified port (for example, the port is already being used). It is widely used so the applications of java.


1 Answers

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();     } } 
like image 82
Joel Avatar answered Oct 04 '22 05:10

Joel