Cyril Rabat


Exemple d'utilisation de HttpServer

 11/12/2013     18/10/2017      Programmation Java      Programmation client/serveur      Http   

Créer un serveur Http à l'aide de la classe HttpServer

   Cet article présente comment développer un serveur Http en utilisant la classe Java HttpServer

Mots-clefs :   Java     HttpServeur   

L'archive suivante contient l'ensemble des fichiers de cet article :

 ServeurHttpSimple.zip

Les différentes classes présentées ici correspondent à un serveur Http basé sur le serveur Http intégré au JDK. Une fois exécuté, le serveur peut être accédé directement depuis un navigateur via l'adresse http://localhost:8080/index.html. À noter que la page index.html est un contexte et pas une page HTML réelle.

La classe principale

Dans le main, nous créons un serveur Http sur le port 8080 (attention au port 80 qui est bloqué dans certains cas). Nous lui associons un contexte index.html auquel nous associons le handler nommé AccueilSimpleHandler.

import java.io.IOException;
import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpContext;
import java.net.InetSocketAddress;
 
/**
 * Classe correspondant à un serveur Http simple.
 * Le serveur écoute sur le port 8080 sur le contexte 'index.html'.
 * Le résultat est une simple page qui affiche les données envoyées en POST et en GET
 * @author Cyril Rabat
 * @version 2017/10/18
 */
public class ServeurHttpSimple {
 
    public static void main(String[] args) {    
        HttpServer serveur = null;
        try {
            serveur = HttpServer.create(new InetSocketAddress(8080), 0);
        } catch(IOException e) {
            System.err.println("Erreur lors de la création du serveur " + e);
            System.exit(-1);
        }
 
        serveur.createContext("/index.html", new AccueilSimpleHandler());
        serveur.setExecutor(null);
        serveur.start();
 
        System.out.println("Serveur démarré. Pressez CRTL+C pour arrêter.");
    }
 
}

 Télécharger le fichier

La classe correspondant au handler

Dans ce handler, nous nous contentons de retourner un code HTML contenant les données envoyées en GET et en POST.

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.Headers;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.io.OutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;
 
/**
 * Classe correspondant au handler sur le contexte 'index.html'.
 * @author Cyril Rabat
 * @version 2017/10/18
 */
class AccueilSimpleHandler implements HttpHandler {
 
    public void handle(HttpExchange t) {
        String reponse = "<h1>Bienvenue sur la page d'accueil</h1>";
 
        // Récupération des données en GET
        URI requestedUri = t.getRequestURI();
        String query = requestedUri.getRawQuery();
 
        reponse += "<p>Données en GET : ";
        if(query == null)
            reponse += "<b>Aucune</b></p>";
        else
            reponse += "<b>" + query + "</b></p>";
 
        // Utilisation d'un flux pour lire les données du message Http
        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(t.getRequestBody(),"utf-8"));
        } catch(UnsupportedEncodingException e) {
            System.err.println("Erreur lors de la récupération du flux " + e);
            System.exit(-1);
        }
 
        // Récupération des données en POST
        try {
            query = br.readLine();
        } catch(IOException e) {
            System.err.println("Erreur lors de la lecture d'une ligne " + e);
            System.exit(-1);
        }
 
        reponse += "<p>Données en POST : ";
        if(query == null)
            reponse += "<b>Aucune</b></p>";
        else
            reponse += "<b>" + query + "</b></p>";
 
        // Envoi de l'en-tête Http
        try {
            Headers h = t.getResponseHeaders();
            h.set("Content-Type", "text/html; charset=utf-8");
            t.sendResponseHeaders(200, reponse.getBytes().length);
        } catch(IOException e) {
            System.err.println("Erreur lors de l'envoi de l'en-tête : " + e);
            System.exit(-1);
        }
 
        // Envoi du corps (données HTML)
        try {
            OutputStream os = t.getResponseBody();
            os.write(reponse.getBytes());
            os.close();
        } catch(IOException e) {
            System.err.println("Erreur lors de l'envoi du corps : " + e);
        }
    }
 
}

 Télécharger le fichier

Fichier HTML pour tester le serveur

Pour tester le serveur, il est possible d'utiliser un simple navigateur et d'aller sur la page http://localhost:8080/index.html. L'autre solution est d'utiliser le fichier HTML suivant qui permet d'envoyer des données soit en GET, soit en POST sur cette même adresse (n'oubliez pas de changer le champ action du formulaire en cas de modification du numéro de port).

<html>
  <head>
    <title>Formulaires pour tester le serveur Http simple</title>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
  </head>
  <body>
    <h1>Formulaires pour tester le serveur Http simple</h1>
 
    <form method="get" action="http://localhost:8080/index.html">
      <label>Nom</label><input type="text" name="nom"/>
      <label>Prénom</label><input type="text" name="prenom"/>
      <button>Valider en GET</button>
    </form>
 
    <form method="post" action="http://localhost:8080/index.html">
      <label>Nom</label><input type="text" name="nom"/>
      <label>Prénom</label><input type="text" name="prenom"/>
      <button>Valider en POST</button>
    </form>
  </body>
</html>

 Télécharger le fichier

Compilation et exécution

Dans un premier temps, compilez les deux classes. Ensuite, exécutez le serveur qui se mettra alors en attente. Vous pouvez ensuite ouvrir le fichier HTML via un navigateur ou bien saisir directement l'URL http://localhost:8080/index.html dans un navigateur.

Articles connexes


Version de cette page Mercredi 16 Décembre 2015

© Cyril Rabat 2018

Connexion

Mot de passe perdu

Dernières nouvelles

20/07/2020 Vous pouvez consulter la page "prérentrée" pour avoir les informations sur les journées de prérentrées en Licence INFO.
16/07/2020 La première phase des inscriptions se termine le 21 juillet. La période pour la deuxième phase est du 19 au 31 août.
25/06/2020 La période pour la phase complémentaire pour la procédure VES est fixée du 10 juillet 2020 au 24 août 2021.
29/05/2020 Le jury de fin d'année aura lieu le jeudi 11 juin, les examens de deuxième session du 22 juin au 3 juillet et le jury de deuxième session le jeudi 16 juillet.

Contact

Courriel :
cyril.rabat [at] univ-reims.fr

Téléphone :
+33-326-91-33-81

Facebook :
lien Facebook direct