I'd really appreciate some help with the following. I have several javaapplets that each use an RMI server. This has been working find in a configuration where the server's DNS name is bound to its static IP address. Now, however, I am trying to use a configuration where the server's DNS name is bound to the static IP address of a cable modem, which is connected to a router, to which the server is attached. That is, flemingdp.com is bound to the static IP address 220.127.116.11 (the address of the cable modem), while the server has the static IP address 192.168.0.4 on the subnet created by the router. The router port forwards the rmiregistry port (1099) and the listening ports for the rmi servers (10099, etc) from 18.104.22.168 to 192.168.0.4. It also port forwards port 80, for example, and apache works. But rmi does not.
In one server, for example, I do
where DataAccess extends UnicastRemoteObject and has this as the first line in its constructor:
super(10099,new MyClientSocketFactory(),new MyServerSocketFactory());
I have tried various settings for java.rmi.server.hostname when I start the server, without avail, and have also tried various settings in /etc/hosts.
In particular, when I do this to start the server:
where 22.214.171.124 is the static IP address of the router, which is bound to flemingdp.com
I get this:
mfleming@s1:/var/www/regular/htdocs$ java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.AccessException: Registry.Registry.rebind disallowed; origin /126.96.36.199 is non-local host
Thanks in advance for your help -- this is really driving me nuts.
The problem is not there because of your server but because of the RmiRegistry.
The RMIRegistry does not allow a bind/rebind from any other machine but from the local host.
In your case, you are making the bind request to the router which gets forwarded to the server running rmi registry but the client now becomes the router and not the originating server. So, the RMI Registry thinks that someone (router), apart from the box the registry is running, is attempting a bind and hence rejects it. This is the reason why you get
Registry.Registry.rebind disallowed; origin /188.8.131.52 is non-local host
This clearly tells that RMI Registry takes the client as 184.108.40.206 or your router.
I am not sure why while binding you want to go to through the router. I assume the router path is for external clients, yes/no?
BTW, is your server and RMI Registry running on the same box? If not, then this will not work.