Compter les nombres d'occurrences des mots d'un texte

Version Client/Serveur


Objectifs : Mise en œuvre des sockets en mode connecté. Utilisation des classes Socket et ServerSocket du paquetage java.net. 

Révision : Gestion des exceptions - Manipulation des flux d’entrée-sortie.

Note : On pourra utiliser les supports de cours sur les sockets clients et les socket serveurs.

Dans cet exercice nous écrivons un serveur qui va lister les différents mots d'un fichier texte en comptant pour chaque mot son nombre d'occurrences.
On écrira aussi un client qui doit se connecter, lire le fichier en l'envoyant au serveur et attendre la réponse (la liste des mots et leurs occurrences).

  1. Modifier la classe CompterMots (donnée)
  2. Coder une classe avec main() correspondant au serveur. Cette classe utilisera la classe CompterMots. Vous pouvez vous baser sur l'exemple du cours.
  3. Coder une classe correspondant au client. Vous pouvez vous baser sur l'exemple du cours.
  4. Modifier le serveur de façon à lancer un thread pour chaque requête.
    A vous de choisir si vous voulez que la classe correspondant au serveur dérive de la classe Thread ou implémente l'interface Runnable ou si vous voulez que ce soit la classe CompterMots qui gère le thread.

La classe CompterMots

import java.io.*;
import java.util.*;

class CompterMots {

     public static void main (String[] argv) {

     // les parametres sont-ils précisés
     if (argv.length < 2) {
	System.err.println
		("usage : java CompterMots fichier_texte fichier_resultat");
     }

     try {
      	Hashtable table = new Hashtable();
      	BufferedReader entree = new BufferedReader(new FileReader(argv[0]));
      	String ligne;
      	StringTokenizer st;

      	// lecture du fichier ligne à ligne
      	while ((ligne = entree.readLine()) != null) {
            // creation du découpeur de ligne
            st = new StringTokenizer(ligne, " ,.;:_-+*/\\.;\n\"'{}()=><\t!?");

             // tant qu'il y a des mots
             while (st.hasMoreTokens()) {
                // on recupere le mot
                String mot = st.nextToken();

                // on le cherche dans la table
                Object obj = table.get(mot);
                // s'il n'y est pas
                if
                  (obj == null)
		  // on l'ajoute
                  table.put(mot, new Integer(1));
                else {
                  // sinon on incrémente
                  Integer prec = (Integer) obj;
                  table.put(mot, new Integer(prec.intValue()+1));
                }
             }
       	}

       	// ne pas oublier de fermer le fichier
       	entree.close();

	Enumeration lesMots = table.keys();

        // Creation du fichier resultat
	PrintWriter fluxSortie = new PrintWriter(new FileWriter(argv[1]));

        // parcours de toutes les entrées de la table de hashing

        while (lesMots.hasMoreElements()) {
		// on recupere le mot suivant
                String mot = (String)lesMots.nextElement();
                // on cherche l'Integer correspondant dans la table
                Object obj = table.get(mot);
                if
                  (obj == null)
                  System.err.println("erreur");
                else {
                  // on affiche sur l'écran et dans le fichier resultat
                  Integer nb = (Integer) obj;
                  System.out.println("Le mot "+mot+" est présent "+nb+" fois");
		  fluxSortie.println("Le mot "+mot+" est présent "+nb+" fois");
                }
        }

	// ne pas oublier de fermer le fichier
        fluxSortie.close();

    } catch(FileNotFoundException e1) {
      System.out.println("Le fichier "+argv[0]+" n'existe pas");
    } catch(IOException e2) {
      System.out.println("Erreur pendant la lecture du fichier");
    }
  }
}

Extrait de la classe java.lang.System

java.lang
Class System

java.lang.Object
  |
  +--java.lang.System

public final class System
extends Object

The System class contains several useful class fields and methods. It cannot be instantiated.

Among the facilities provided by the System class are standard input, standard output, and error output streams; access to externally defined "properties"; a means of loading files and libraries; and a utility method for quickly copying a portion of an array.

 

Since:
JDK1.0

Field Summary
static PrintStream err
          The "standard" error output stream.
static InputStream in
          The "standard" input stream.
static PrintStream out
          The "standard" output stream.
  ...