[JAVA]Remote Cast with RMI
yozine
Posted messages
11
Registration date
Status
Member
-
yozine Posted messages 11 Registration date Status Member -
yozine Posted messages 11 Registration date Status Member -
Hi, I'm having a bit of trouble running RMI with Eclipse. Any help would be greatly appreciated!
I created two packages, corresponding to the client and server of the application I want to distribute:
STEU_client
STEU_server
The server contains:
- InterfaceEau.java (remote interface)
- EauImp.java (extends UnicastRemoteObject)
- StartEau.java (starts the registry and registers the EauImpl service)
- EauImp_stub.java (generated by rmic)
+ other classes not useful here
Client contains:
- InterfaceEau.java (remote interface)
- TestRMI.java (client that calls the RMI stub)
+ ...
I generate the stub on the server side (apparently with JRMP 1.2 there is no longer a skeleton on the client side)
I set up an RMI security manager on both client and server sides.
I start my RMI registry on 'localhost:1099' and register the remote service with 'bind'. So far, so good.
Then I call the registered service with a client using 'lookup'.
I cast the Remote object returned by the name of my remote interface.
And then I have ..
.. the error in question: "java.lang.ClassCastException: rmi.steu.server.EauImpl_Stub cannot be cast to rmi.steu.client.InterfaceEau ..."
Does anyone have any idea?
I created two packages, corresponding to the client and server of the application I want to distribute:
STEU_client
STEU_server
The server contains:
- InterfaceEau.java (remote interface)
- EauImp.java (extends UnicastRemoteObject)
- StartEau.java (starts the registry and registers the EauImpl service)
- EauImp_stub.java (generated by rmic)
+ other classes not useful here
Client contains:
- InterfaceEau.java (remote interface)
- TestRMI.java (client that calls the RMI stub)
+ ...
I generate the stub on the server side (apparently with JRMP 1.2 there is no longer a skeleton on the client side)
I set up an RMI security manager on both client and server sides.
I start my RMI registry on 'localhost:1099' and register the remote service with 'bind'. So far, so good.
Then I call the registered service with a client using 'lookup'.
I cast the Remote object returned by the name of my remote interface.
And then I have ..
.. the error in question: "java.lang.ClassCastException: rmi.steu.server.EauImpl_Stub cannot be cast to rmi.steu.client.InterfaceEau ..."
Does anyone have any idea?
Configuration: Windows XP Firefox 1.0.4
7 answers
Hi, I'm having a bit of trouble getting RMI to work with Eclipse. Any help would be greatly appreciated!
I've created two packages, corresponding to the client and server of the application I want to distribute:
STEU_client
STEU_server
The server contains:
- InterfaceEau.java (implements Remote)
- EauImp.java (extends UnicastRemoteObject)
{
//...
InterfaceEau serverEau =
(InterfaceEau) Naming.lookup(url);
//...
}
Is that what you have?
It's funny that it's trying to cast the stub...
Can you be a bit more specific please (a small piece of code ^^)
I've created two packages, corresponding to the client and server of the application I want to distribute:
STEU_client
STEU_server
The server contains:
- InterfaceEau.java (implements Remote)
- EauImp.java (extends UnicastRemoteObject)
{
//...
InterfaceEau serverEau =
(InterfaceEau) Naming.lookup(url);
//...
}
Is that what you have?
It's funny that it's trying to cast the stub...
Can you be a bit more specific please (a small piece of code ^^)
Here's a bit of code to illustrate:
In this code, I call the remote object and cast it. That’s what it should normally do..
In this code, I call the remote object and cast it. That’s what it should normally do..
package rmi.steu.client; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RMISecurityManager; import java.rmi.Remote; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class TestRMI extends UnicastRemoteObject { private InterfaceEau init; private String retourRMI; public TestRMI() throws RemoteException { try { System.setSecurityManager(new RMISecurityManager()); init = (InterfaceEau) Naming.lookup("rmi://localhost:1099/communique_etat"); retourRMI = init.getBonjour(); System.out.print(retourRMI); } catch ...
this is what should be done as a standard...
the issue may come from the RMISecurityManager
or the bind, what did you bind? an instance of EauImp.java
indeed with jdk 1.5 the skeleton is no longer present
the issue may come from the RMISecurityManager
or the bind, what did you bind? an instance of EauImp.java
indeed with jdk 1.5 the skeleton is no longer present
ouep here it is for the binding, all of this is in StartEau, I bind an EauImpl object:
try { java.rmi.registry.LocateRegistry.createRegistry(1099); //System.out.println("Setting up the Security Manager ..."); System.setSecurityManager(new java.rmi.RMISecurityManager()); } catch(Exception e) { System.out.print("An RMI registry already exists.\n\n"); } try { // register the service Naming.bind("communique_etat", new EauImpl()); } catch
I've found the problem.
In fact, the client and the server need to use the same file containing the interface. Apparently, having a copy of the file containing the interface in the client project is not enough.
The cause is probably a 'classloader' issue. The ideal would be for the client to load the file containing the interface that is located on the server, using its URL. Apparently, this can be done. So I will need to work on the 'classloader' for the 'remote interface'.
All this just to display 'hello'...
In fact, the client and the server need to use the same file containing the interface. Apparently, having a copy of the file containing the interface in the client project is not enough.
The cause is probably a 'classloader' issue. The ideal would be for the client to load the file containing the interface that is located on the server, using its URL. Apparently, this can be done. So I will need to work on the 'classloader' for the 'remote interface'.
All this just to display 'hello'...
Indeed, it's at the classloader level that you'll need to configure everything.
I believe there are things that can be done with the SecurityManager.
Here's something that could help you:
https://docs.oracle.com/javase/tutorial/rmi/running.html
Don't forget to post your solution's code :)
It could always be useful later on.
I believe there are things that can be done with the SecurityManager.
Here's something that could help you:
https://docs.oracle.com/javase/tutorial/rmi/running.html
Don't forget to post your solution's code :)
It could always be useful later on.
Actually, for the classloader it doesn't seem too complicated, there's just one function to call I think, but you need to put the classes in a jar, I don't know how to do that, but that's not too serious.. I just wanted to know how RMI calls work and get it running.
Otherwise, to solve the issue, I created a common project for both the client and server projects in Eclipse, and it works well.
Otherwise, to solve the issue, I created a common project for both the client and server projects in Eclipse, and it works well.