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).
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.Object | +--java.lang.System
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.
Field Summary | |
static PrintStream |
err The "standard" error output stream. |
static InputStream |
in The "standard" input stream. |
static PrintStream |
out The "standard" output stream. |