Exercices
Echanges TCP
Chaque stagiaire doit écrire un client et un serveur utilisant les communications sur Socket TCP:
Chaque serveur est un programme autonome qui écoute sur le port 6666 et
qui envoie un message secret à tout client qui se connecte.
Ce message secret est un tableau de String
s local au serveur.
Les envois se feront par writeUTF()
(de DataOutputStream
).
Quand le serveur a fini d’envoyer toutes les chaînes du tableau il coupe simplement la communication.
Chaque client est un code lié à l’interface graphique question/réponse que nous avons réalisé lors des exercices précédents : lorsque l’utilisateur tape le nom d’un hôte sur le réseau, le code contacte le serveur correspondant et affiche le message secret. (en fait on boucle jusqu'à ce que la communication soit coupée!)
Propositions de corrigés :
-
code applicatif client (noter qu’ici dans la fenêtre de saisie on entre le nom de la machine hote puis le numero de port!)
Exemples
Echanges TCP
package org.labs.net;
import java.io.*;
import java.net.*;
public class ServeurSecret extends Serveur {
private String[] messages = {
"Hello",
"NET WORLD!",
" avec ces caractères accentués comme en Français!"
};
@Override
public void lireEcrire(Socket sck) throws IOException {
OutputStream os = sck.getOutputStream();
DataOutputStream dos = new DataOutputStream(
new BufferedOutputStream(os));
for (String phrase : messages) {
dos.writeUTF(phrase);
}
dos.flush() ;
// dos.close(); sera fermé avec la socket
}
public ServeurSecret(int port) throws IOException {
super(port);
}
public static void main(String[] args) throws Exception {
Serveur serv = new ServeurSecret(Integer.parseInt(args[0]));
serv.go();
}
}
package org.labs.net;
import java.io.*;
import java.net.*;
import java.lang.System.Logger ;
import static java.lang.System.Logger.Level.* ;
/** serveur simple thread : la tache lireEcrire doit rapidement
* s'exécuter
*/
public abstract class Serveur {
private System.Logger logger = System.getLogger("org.labs");
protected ServerSocket srv;
protected Serveur(int port) throws IOException {
srv = new ServerSocket(port);
}
public void go() {
while (true) {
// try AutoCloseable!
try (Socket sck = srv.accept()){
lireEcrire(sck);
} catch (Exception exc) {
logger.log(ERROR, "server error", exc);
}
}
}
public abstract void lireEcrire(Socket sck) throws Exception;
}
package org.labs.net;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.StringTokenizer;
import org.labs.ihm.Repondeur;
/**
* devrait plutot utiliser un modèle retournant un Iterator (ou basé sur un Flow)!
*/
public class RepondeurMessageSecret implements Repondeur{
@Override
public String repondA(String question) throws Exception {
StringTokenizer stk = new StringTokenizer(question) ;
String host = stk.nextToken() ;
int port = Integer.parseInt(stk.nextToken()) ;
Socket sck = new Socket(host, port) ;
DataInputStream dis = new DataInputStream(
new BufferedInputStream(sck.getInputStream())) ;
StringBuilder build = new StringBuilder() ;
try {
while(true) {
build.append(dis.readUTF()).append('\n');
}
} catch(IOException exc) {
/*IGNORE */
}
return build.toString();
}
}