RMI callbacks

Posted on 1998-08-20
Last Modified: 2013-12-29
We are using RMI to call a remote application's methods from an applet. We know that the reverse (ie. calling an applet's method from an application ) is also possible but we are not able to do it. Can u give us a step by step method with all the details (directory - name of server etc. ) and also suggest why it is not currently possible)
Question by:shyamala

Expert Comment

ID: 1222166
applet must extend a remote interface, should be signed, register with the rmi registry with naming.bind, should not create rmi security manager. all the classes (stubs and skeletons) must be accessible to both application and applet (classpath and code base).


Expert Comment

ID: 1222167
RmiRegistry is an .exe Application.
It could be run in the Client, but it's not a good solution.
And, It's not a good idea to open ServerSocket on Applet.

Accepted Solution

knollc earned 150 total points
ID: 1222168
Actually, you do not need to sign an applet to allow callbacks.  Its very simple:  You already have an applet which does a lookup to find a remote server.  So, the next thing you should do is have your APPLET implement a remote interface which the SERVER object understands (ie. the remote interface is in the classpath).  Then, your applet can call a remote object and pass as a parameter 'this' (meaning the applet itself) which will be the remote interface you have implemented in the applet.  So, here's how it looks:

public interface remote_appletInterface extends Remote
  myFirstFunction() throws RemoteException;
  myNextFunction() throws RemoteException;

public class MyApplet extends Applet implements remote_appletInterface
  // applet code here for looking up remote server
  // next we need to implement the remote_appletInterface

public server implements remote_Server
   // you already have code to allow the applet call the server methods
  // the next function allows a remote applet to register itself with the server for callbacks
  function notifyServer(remote_appletInterface remoteApplet)
    // store the remote_appletInterface in a vector or a local var for later use.  
    // you may call the functions myFirstFunction() and myNextFunction() on the applet
    // because the applet implements this interface. So:
    remoteApplet.myFirstFunction();  // this is a callback!

FINALLY:  somewhere in the applet (perhaps the start or init)

public void init()
   // look up the server
  remoteServer.notifyServer(this);  // by sending a remote interface to the server (namely, the applet), the server can then make calllbacks.

REMEMBER:  The rmic will be run on the applet class file to generate the stub and skel files that the SERVER will need to communicate back to the applet.  Make sure these files are accessable to the server and applet.  (the applet needs them to recieve calls from the server and the server needs them to make calls to the client).  

Hope this helps!

Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.


Author Comment

ID: 1222169
Mr. Knolloc, Thanx for ur interest. I tried out your solution but I am getting Applet security exception. Can u give a more detailed answer, with the exact folder names in which the program resides (it is ok if it is hard coded) and all the other details

Expert Comment

ID: 1222170
Sure.  According to netscape, you will get an applet security exception if the proxy/stub is found in the local machine's classpath.  You may have received an exception saying that you can not connect to <remote ip address> from <local class path>.  The reason is that the class loader in netscape found the proxy on your local machine, and the proxy is trying to connect to the web server.  Well, the proxy can only connect to the machine it was downloaded from (in this case, local), so you will get a security exception when you attepmpt the callback.  I also had this problem, but because of other activities I coudln't complete my tests.  I recommend you make sure all traces of the stub_ skel_ classes are removed from the local system and have them ONLY reside on the web server.  Then try the test.

Also, you only need rmiRegistry running on the web server (if that is where your server object is running, which, in the case of an applet call back, is required because the applet will only be able to connect to objects on the web server it was downloaed from).  I'll crack open the books and try to get my demo working and send you anything I am able to come up with.



Expert Comment

ID: 1222171
Here's some specifics and an example:

remote_Applet.class : interface to the applet
mainApplet.class : the applet that implements the remote_Applet interface.

remote_Server.class : interface to the server class
mainServer.class : the server object that implements the remote_Server interface

mainApplet_stub/skel : the proxy/stubs generated by calling rmic on mainApplet.class
mainServer_stub/skel: the proxy/stubs generated by calling rmic on the mainServer.class

Here's where the files should go:
remote_Applet.class  : in web server applet directory AND in classpath of server object (the server object needs it to make callbacks.)
mainApplet.class : in weber server applet directory
remote_Server.class : in web server applet directory AND in classpath of server object (the applet needs it to connect to the remote object)
mainServer.class : in the server classpath
mainServer_stub/skel : in web server applet directory AND in classpath of server object
mainApplet_stub/skel: in web server applet directory AND classpath of server object

Notice how both the applet and server objects need to have all the stub/skel classes in their classpaths.  this is because the stub/skel is doing the work of making the connection to each other and 'marshalling' the data being transfered from client to server.  if there was no callbacks being performed, only the server would need the skel and client need the stub in their classpaths.

I hope this helps a little bit.  I'll dig up some of my old work and try out some things and let you know if I get it to work!



Featured Post

Live: Real-Time Solutions, Start Here

Receive instant 1:1 support from technology experts, using our real-time conversation and whiteboard interface. Your first 5 minutes are always free.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
configure dependency in POM for new database 3 25
by zero exception 10 39
JavaFX TableView not displaying correctly 3 16
mysql jsp example issue 32 32
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
Introduction This article is the last of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article covers our test design approach and then goes through a simple test case example, how …
This tutorial covers a step-by-step guide to install VisualVM launcher in eclipse.
This tutorial explains how to use the VisualVM tool for the Java platform application. This video goes into detail on the Threads, Sampler, and Profiler tabs.

776 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question