Salut à tous.
J'ai un TP à faire pour un cours de programmation répartie. La 1ère partie du TP consiste à créer une appli console client serveur en utilisant RMI pour récupérer un objet du serveur. Cet objet propose 3 méthodes pour récupérer la liste des processus du serveur, la RAM libre et l'occupation CPU.
Pour la 1ère partie tout fonctionne.

Maintenant j'en suis à la 2ème partie ou il faut mettre en place une interface graphique web avec un formulaire avec 2 input text pour renseigner le nom du serveur RMI et le port et 3 checkbox pour choisir d'afficher la liste des processus du serveur, la RAM libre et l'occupation CPU. Pour cela il faut avoir bien sur au préalable mis en route le serveur RMI en appli console.
J'ai donc fait quasiment du copier coller de mes classes java clientes que j'ai adapter en appli web après avoir suivit le début du tutoriel J2EE sur le site et en essayant d'utiliser le modèle MVC.

Je me heurte à un problème au suivant : au moment de faire un Naming.lookup pour récupérer l'objet partagé de mon serveur j'ai le droit au message d'erreur suivant :
RmiServer_Stub cannot be cast to com.servlet.getinfoserver.model.RmiIterface

J'ai donc essayé de copié le RmiServer_Stub que j'avais généré avec rmic dans le répertoire \webapps\MonAppli\WEB-INF\classes mais ca ne marche toujours pas.
Je sais pas ou mettre ce maudit stub pour que ca marche.

Voici l'arborescence de mon projet sous eclipse :


Et du code :

Mes 3 Classes Model

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
 
package com.servlet.getinfoserver.model;
 
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.util.ArrayList;
import java.util.List;
 
import com.servlet.getinfoserver.model.MyHostName;
 
public class GetInfoRmiServer {
	List<String> process = new ArrayList<String>();
	List<String> memory = new ArrayList<String>();
	List<String> cpu = new ArrayList<String>();
 
 
 
	public List<String> getListOfProcessus() {
		return this.process;
	}
 
	public List<String> getFreeMemory() {
		return this.memory;
	}
 
	public List<String> getCPU() {
		return this.cpu;
	}
 
	//Constructeur
	public GetInfoRmiServer(String port,String machine) {
		try
		{
			// Recuperer la reference d'objet du serveur a interroger
			// a partir d'un nom symbolique. Cette reference est 
			// renvoyee par le service de nom de JAVA : rmiregistry
			// 
			// La structure d'un nom est :  //machine:port/nom
			// "machine" est le nom de la machine ou tourne le service
			// et "nom" correspond au nom du service.
			// le "port" est le numero de port
			// ou rmiregistry est en attente des requetes
			// pour le service de noms
			//
			//
			if (System.getSecurityManager() == null) 
				System.setSecurityManager(new RMISecurityManager());
 
			MyHostName serveur = new MyHostName(machine);
 
			String nomService = "//" + serveur.QualifiedHost() + ":" + port + "/RmiServer";
			RmiIterface obj = (RmiIterface) Naming.lookup (nomService);
 
			// Finalement, on peut invoquer la methode de l'objet
			// qui est heberge par le serveur
			//
			process = obj.getListOfProcessus();
			memory = obj.getFreeMemory();
		    cpu = obj.getCPU();
		}
 
		catch (Exception e)
		{
			File log = new File("./webapps/TP3_Exo2/" + "logExecption.txt");
			try {
				log.setWritable(true);
				log.createNewFile();
				FileWriter fwLog = new FileWriter(log);
				String message = e.getMessage();
				fwLog.write(message);
				fwLog.close();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			e.printStackTrace();
		}
	}
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
package com.servlet.getinfoserver.model;
import java.util.List;
 
 
// Definition de l'interface de l'objet distant
//
 
 
public interface RmiIterface extends java.rmi.Remote 
{
	List<String> getListOfProcessus() throws java.rmi.RemoteException;
 
	List<String> getFreeMemory() throws java.rmi.RemoteException;
 
	List<String> getCPU() throws java.rmi.RemoteException;
}

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
 
package com.servlet.getinfoserver.model;
 
import java.net.*;
 
 
//
// Cette classe permet d'obtenir les nom DNS soit de facon qualifie
// soit de facon non qualifie ; et ce qq soit la forme avec laquelle
// la classe est instanciee
//
public class MyHostName 
{
 
 
	private String hostname;
	private String domain = "";
 
 
	public MyHostName(String hote)  
	{
		if(hote.equals(""))
			this.local();
		else	if (hote.indexOf(".")==-1)
				hostname = hote;
			else	hostname = hote.substring(0,hote.indexOf("."));
	}
 
 
	public MyHostName() 
	{
		this.local();
	}
 
 
	private void local() 
	{
		try 
		{
			InetAddress machine = InetAddress.getLocalHost();
                	hostname = machine.getHostName();
 
			if (hostname.indexOf(".")!=-1)
				hostname = hostname.substring(0,hostname.indexOf("."));
 
		}
		catch(UnknownHostException e) 
		{
		System.out.println ("MyHostName exception: " + e.getMessage ());
		e.printStackTrace ();
		}
	}
 
 
	public String nonQualifiedHost() 
	{
		return (hostname);
	}
 
 
	public String QualifiedHost() 
	{
		return (hostname + domain);
	}
 
}
Mes 2 Classes Pour les fomulaires

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
package com.servlet.getinfoserver;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class Form extends HttpServlet {
 
	public void doGet(	HttpServletRequest request, 
						HttpServletResponse response)
						throws IOException, ServletException{
 
		request.getRequestDispatcher("form.jsp").forward(request, response);		
	}
 
}

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 
package com.servlet.getinfoserver;
 
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import com.servlet.getinfoserver.model.GetInfoRmiServer;
 
public class FormAction extends HttpServlet {
 
	public void doPost(	HttpServletRequest request, 
						HttpServletResponse response)
						throws IOException, ServletException{
 
	List<String> option = new ArrayList<String>();
	Enumeration<String> e = request.getParameterNames();
 
 
 
	//On parcours cette liste
	while(e.hasMoreElements()){
		String key = e.nextElement();
                    //On vérifie les valeurs des checkbox : 'on' signifie que la checkbox est cochée
		if(request.getParameter(key).equals("on")){
			option.add(key);
		}
		else{
		}
	}
	if(option.size() > 0) {	
		GetInfoRmiServer infoServer = new GetInfoRmiServer(request.getParameter("port"),request.getParameter("rmiserver"));
 
		for(String str : option) {
			if (option.equals("process"))
				request.setAttribute("process", infoServer.getListOfProcessus());
			if (option.equals("memory"))
				request.setAttribute("memory", infoServer.getFreeMemory());
			if (option.equals("cpu"))
				request.setAttribute("cpu", infoServer.getCPU());
		}
	}	
	request.getRequestDispatcher("formResult.jsp").forward(request, response);
	}
}
J'ai pas mis mes JSP car pour l'instant je bloque au bout de code de la classe com.servlet.getinfoserver.model.GetInfoRmiServer suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
RmiIterface obj = (RmiIterface) Naming.lookup (nomService);
qui me renvoit l'erreur :
RmiServer_Stub cannot be cast to com.servlet.getinfoserver.model.RmiIterface

D'ailleurs l'erreur je la récupère en créant un fichier texte car j'ai pas trouvé mieux.
Voir le bout de code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
catch (Exception e)
		{
			File log = new File("./webapps/TP3_Exo2/" + "logExecption.txt");
			try {
				log.setWritable(true);
				log.createNewFile();
				FileWriter fwLog = new FileWriter(log);
				String message = e.getMessage();
				fwLog.write(message);
				fwLog.close();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			e.printStackTrace();
		}

Voilà j'ai cherché un peu partout sur le web, je me doute qu'il faut faire quelque chose avec le _Stub mais je l'ai copié à peu près partout le dossier de mon appli et j'ai toujours ce problème.
Merci d'avance pour ceux qui auront pris le temps de regarder mon pb.
Je rappelle que je suis débutant et que j'ai appris le java juste pour le cours. Avant je n'avais aucunes notions.