EchoUDPClient.java

package fr.umlv.ji.udp;
import java.net.*;
/** Classe d'un client UDP pour le protocole Echo (RFC 862). */
public class EchoUDPClient {
  final static int ECHO_PORT = 7;  // Port réservé pour le protocole Echo
  final static int MARGIN = 10;    // Marge pour la zone de réception
  /** Envoie un texte vers un serveur Echo et affiche sa réponse.  */
  public static void main(String[] args) throws java.io.IOException {
    // Vérification de la présence des paramètres sur la ligne de commande
    if (args.length != 2) {
      System.err.println("Usage: java EchoUDPClient <server> <text>");
      System.exit(1);
    } // Création de l'objet datagramme à émettre
    byte[] buffer = args[1].getBytes(); 
    InetAddress server = InetAddress.getByName(args[0]);
    DatagramPacket datag = new DatagramPacket(buffer,0,buffer.length,
                          server,ECHO_PORT);
    // Création de l'objet socket locale, avec une adresse de socket  
    // nulle, et mise en évidence de son non-attachement
    DatagramSocket localSocket = new DatagramSocket(null);
    System.out.println("Socket locale créée. Attachée? " +
               localSocket.isBound());
    // Attachement de la socket à un port libre 
    // et une adresse IP locale valide
    localSocket.bind(null);
    System.out.println("Socket locale attachée? " +
               localSocket.isBound());
    // Émission du datagramme vers le serveur
    localSocket.send(datag);
    System.out.println(datag.getLength() + " octets émis de " +
               localSocket.getLocalSocketAddress() +
               "\n\tvers " + datag.getSocketAddress());
    /* Mise en place, dans le datagramme, d'une zone de stockage vierge
       et élargie par une marge (pour la mise en évidence du contenu du
       datagramme reçu et de la différence de valeur de retour de
       getLength() avant et après la réception).    */
    int length = buffer.length; 
    datag.setData(new byte[length+MARGIN],0,length+MARGIN);
    System.out.println("Capacité de la zone de stockage: "+
               datag.getLength());
    // Attente de réception des données
    localSocket.receive(datag);
    // Affichage de la taille et du contenu des données reçues
    System.out.println(datag.getLength() + " octets reçus, contenant: " +
      new String(datag.getData(), datag.getOffset(), datag.getLength()) + 
               "\net provenant de " + datag.getSocketAddress());
    // Fermeture de la socket locale
    localSocket.close();
  } 
}