Hello,
I'm new to RMI and have a problem where I need your help.
I'd written a Java-Application which starts an RMI-Server.
When the RMI-Server is started, a local client connects to the RMI-Host, from localhost. This works fine.
If I connect later from a remote client, the remote client throws the following exception:
java.rmi.ConnectException: Connection refused to host: localhost; nested exception is:
java.net.ConnectException: Connection refused: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:574)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:94)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:179)
] at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)
This happens even if the RMI-Server-Application is running.
The firewalls on both computers are disabled for the test.
If I run telnet <RMI-Host> <RMI-Port> I get a connection to the RMI-Host even from the remote computer.
Here is the code of the RMI-Host:
private void registerAll() throws RemoteException
{
/*
* Register the stubs in the registry
*/
registerObj = new Register(this.registeredClients);
registerStub = (IWatchdogCtrl) UnicastRemoteObject.exportObject(registerObj, 0);
String registerRegistryname=((Register)registerObj).getFullRegistryname();
registry.rebind(registerRegistryname, registerStub);
messageObj = new Messaging(this.registeredClients);
messageStub = (IMessaging) UnicastRemoteObject.exportObject(messageObj, 0);
String messageRegistryname=((Messaging)messageObj).getFullRegistryname();
registry.rebind(messageRegistryname, messageStub);
}
public void startWatchdog() throws IOException
{
if (System.getSecurityManager() == null) {
System.setSecurityManager(new AllGrantSecurityManager());
}
String codebase=getCodebase();
System.setProperty("java.rmi.server.codebase", codebase);
System.setProperty("java.rmi.server.hostname", "localhost");
try
{
/*
* Create the registry on a specific port
*/
registry = LocateRegistry.createRegistry(Watchdog.localPort);
/*
* Registers the stubs to the registry
*/
registerAll();
/*
* Start the thread to exit, if no logins are present for a periode
*/
startShutdownListener(idleTime);
}
The registry, RMI-Objects and RMI-Stubs are declared static.
The Shutdownlistener is an ownn thread to keep the server alive.
The AllGrantSecurityManager is a security manager, which don't throws any Exceptions.
Here is the code from the client, where the exception is thrown:
System.setProperty("java.rmi.server.hostname", "Com-123");
Registry registry=LocateRegistry.getRegistry("Com-123",7711);
String applicationName = IWatchdogCtrl.APPLICATION_PREFIX + IWatchdogCtrl.REGISTRY_NAME;
IWatchdogCtrl runOnApp = (IWatchdogCtrl)registry.lookup(applicationName);
String v=runOnApp.getVersion();
logger.debug(v);
The hostname and port is correct.
The applicationName is the same, the client is using on the localhost.
If I run the method, which throws an exception on localhost, all is running fine, too. Only if I want to access the RMI-Server on a remote pc, the exception is thrown.
Can anyone help me please?
Bye Kostarsus