java: XMLRPC

 

Le site officiel pour XMLRPC : http://www.xmlrpc.com/
 

Quelle mise en oeuvre pour java ?

On peut prendre la mise en oeuvre de chez Apache.

Un peu de documentation

    Des transparents : xmlrpc.pdf
    Voici le chapitre d'un livre sur XMLRPC avec des informations de base, notamment, comment on encode les données dans les requêtes entre le client et le serveur : http://www.oreilly.com/catalog/progxmlrpc/chapter/ch03.html
 
 

Un petit test

Le serveur est capable de calculer la surface d'un cercle connaissant le rayon.
Le client interroge le serveur en lui passant le rayon, en résultat, il recoit la surface.
 
Voici les sources du serveur (le serveur et un handler) et du client :
 
AreaServer.java
AreaHandler.java
AreaClient.java
 
 
Un serveur : AreaServer.java avec un handler : AreaHandler.java
 
import java.io.IOException;
import org.apache.xmlrpc.WebServer;
import org.apache.xmlrpc.XmlRpc;
 
public class AreaServer {
    public static void main(String[] args) {
        if (args.length < 1) {
            System.out.println("Usage: java AreaServer [port]");
            System.exit(-1);
        }
 
        try {
 
            // Start the server, using built-in version
            System.out.println("Attempting to start XML-RPC Server...");
            WebServer server = new WebServer(Integer.parseInt(args[0]));
            server.acceptClient ("*.*.*.*"); 
            System.out.println("Started successfully.");
 
            // Register our handler class as area
            server.addHandler("area", new AreaHandler(  ));
            System.out.println("Registered AreaHandler class to area.");
 
            System.out.println("Now accepting requests. (Halt program to stop.)");
            server.start();
 
        } catch (Exception e) {
            System.out.println("Could not start server: " +  e.getMessage(  ));
        }
    }
}
 
public class AreaHandler {
    public Double rectArea(double length, double width) {
        return new Double(length*width);
    }
    public Double circleArea(double radius) {
        double value=(radius*radius*Math.PI);
        return new Double (value);
    }
}
 
 
 
Un client : AreaClient.java
 
import java.io.IOException;
import java.util.Vector;
import org.apache.xmlrpc.XmlRpc;
import org.apache.xmlrpc.XmlRpcClient;
import org.apache.xmlrpc.XmlRpcException;
 
public class AreaClient {
 
    public static void main(String args[]) {
        if (args.length < 1) {
            System.out.println("Usage: java AreaClient [radius]");
            System.exit(-1);
        }
 
        try {
            // Create the client, identifying the server
            XmlRpcClient client = new XmlRpcClient("http://cassoulet.univ-brest.fr:8080");
 
            // Create the request parameters using user input
            Vector params = new Vector(  );
            params.addElement(new Double(args[0]));
 
            // Issue a request
            Object result = client.execute("area.circleArea", params);
 
            // Report the results
            System.out.println("The area of the circle would be: " + result.toString(  ));
 
        } catch (IOException e) {
            System.out.println("IO Exception: " + e.getMessage(  ));
        } catch (XmlRpcException e) {
            System.out.println("Exception within XML-RPC: " + e.getMessage(  ));
        }
    }
}
 

Adaptation du code pour vos TP

Dans le code du client, on remplace l'adresse http de ma machine par celle de la machine sur laquelle tourne le serveur.
Par exemple, si on teste en local, les lignes suivantes
 
          XmlRpcClient client =
              new XmlRpcClient("http://cassoulet.univ-brest.fr:8080");
 
 
sont remplacées par :
 
          XmlRpcClient client =
              new XmlRpcClient("http://localhost:8080");
 
 
 

Exécution

Le serveur est lancé sur la machine serveur (l'argument est le numéro de port utilisé) :
 
java AreaServeur 8080 
 
Le client est exécuté en passant un nombre flottant en argument :
 
java AreaClient 6.5