* Info diverses
String s;  s.length() retourne le nombre de chars utiles
byte[] b;  b.length retourne le nombre de bytes déclarés ("remplis" ou non)

* Utilisation de l'API
- Allez à l'adresse http://java.sun.com/j2se/1.4.2/docs/api/ (l'API de
  Java SE) et mettez-la dans les bookmarks du navigateur.  Vous en
  aurez besoin chaque fois que vous voulez savoir les informations sur
  les classes et méthodes Java.
  - (si vous installez le paquet libgcj-doc, vous avez une copie de
    l'API dans file:///usr/share/doc/libgcj-doc/html/index.html)
- En regardant dans l'API le résumé de la classe DatagramPacket,
  écrivez une phrase sur ce que représente un objet de type
  DatagramPacket.
- Pareil pour DatagramSocket.
- En regardant l'API, trouvez l'en-tête (les paramètres d'entrée et de
  sortie) des méthodes Integer.parseInt et String.valueOf.
- var est une variable String et contient l'adresse IP d'une machine,
  comment récupérer le nom de la machine dans un String ?  Faire aussi
  l'inverse.
- Que faut-il écrire après "s.receive(p);" pour :
  - afficher l'adresse IP de l'émetteur du paquet p
  - afficher le nom de l'émetteur
  - afficher le port de l'émetteur
  - est-ce que l'adresse de destination du paquet p est toujours
    identique à une des adresses IP de la machine destinataire ?

* UDP simple
- Faire un programme client qui envoie une chaîne de caractères,
  ensuite il s'arrête, et un programme serveur sur la même machine,
  qui affiche la chaîne de caractères qu'il reçoit, ensuite il
  s'arrête.
- Modifier le programme serveur pour qu'il reste à l'écoute
  indéfiniment.
- Modifier le client pour qu'il envoie un paquet contenant "ping"
  comme données, ensuite un autre paquet avec "pong", ensuite il
  s'arrête.  Le tester avec le programme serveur précédent.
- Modifier le serveur afin qu'il réponde "ping" quand le client lui
  envoie "pong" et vice versa.  Pour pouvoir tester ce nouveau
  serveur, modifier aussi le client en le faisant afficher le messages
  reçu.
- Modifier le client pour qu'il envoie le message à la machine de
  votre collègue et tester soit avec votre programme à copier sur sa
  machine, soit avec le serveur de votre collègue.

* UDP et broadcast
- Faire un client qui envoie un message à l'adresse broadcast de votre
  réseau.
- Faire un serveur qui écoute sur le port 40000 et qui affiche tout ce
  qu'il reçoit.  Laissez-le tourner, il devrait afficher les messages
  de tout le groupe TP (comme un chat).

* UDP, jeton
Faire un programme qui déplace un jeton de machine en machine.
L'appel à ce programme sera "java Jeton nom portlocal portdistant 1",
pour la machine qui lance le jeton, et "java Jeton nom portlocal
portdistant 0", pour les autres machines, où nom est le nom de la
machine suivante.  Chaque machine (sauf la première, qui commence avec
la deuxième étape) exécute cycliquement :
- attente du jeton ;
- affichage du texte "Jeton recu de la machine de nom ... et d'adresse
  IP ..., le port distant est ..." ;
- attente de trois secondes (Thread.sleep (3000)) ;
- affichage du texte "Jeton renvoye a la machine de nom ... et
  d'adresse IP ..., le port distant est ..." ;
- transmission du jeton à la machine suivante.

* TCP
Un serveur TCP envoie à chaque client qui s'y connecte un petit
message (par ex. "Bonjour"), suivi de 10000 octets (les octets sont
choisis au hasard).  Le serveur se remet à l'écoute.  Le client
affiche le message et le nombre d'octets reçus.
- Que faut-il rajouter pour que le client puisse distinguer le message
  du reste des données ?
- Est-il nécessaire, comme en UDP, que le client lui envoie un message
  (paquet) pour que le serveur sache l'adresse/le port du client ?
- Écrivez le serveur et le client.