title: Java RMI only working localhost
body: <p>I am working on a thin RMI client, but when I try to connect to it from any machine but localhost it gets a refused connection stack trace. I verified that my firewall is off. What else do I need to do. Is there security I need to configure for RMI?</p>
  
  <p>Server.java</p>
  
  <pre><code>package com.ibm.icm.autoconfig.server.rmi;
  
  import java.rmi.RemoteException;
  import java.rmi.registry.LocateRegistry;
  import java.rmi.registry.Registry;
  import java.rmi.server.ExportException;
  import java.rmi.server.UnicastRemoteObject;
  
  public final class Server extends Commands implements ServerHook {
      private Registry registry;
  
      public static void main(String[] args) throws RemoteException {
          Server server = new Server();
          server.Start();
      }
  
      private void Start() throws RemoteException {
  
          ServerHook serverHook = (ServerHook) UnicastRemoteObject.exportObject(this, 0);
  
          // Add serverHook to the local registry -- attempt to create registry
          // instance, if it fails to create, try finding an existing one
          try {
              registry = LocateRegistry.createRegistry(1099);
          } catch (ExportException ee) {
              registry = LocateRegistry.getRegistry(1099);
          }
          registry.rebind("ServerHook", serverHook);
  
          System.out.println("Server Running...");
  
          while (true) {
          }
      }
  }
  </code></pre>
  
  <p>ServerHook.java</p>
  
  <pre><code>package com.ibm.icm.autoconfig.server.rmi;
  
  import java.rmi.Remote;
  import java.rmi.RemoteException;
  
  public interface ServerHook extends Remote {
      public boolean write(String msg) throws RemoteException;
  }
  </code></pre>
  
  <p>Client.java</p>
  
  <pre><code>package com.ibm.icm.autoconfig.client.rmi;
  
  import java.rmi.NotBoundException;
  import java.rmi.RemoteException;
  import java.rmi.registry.LocateRegistry;
  import java.rmi.registry.Registry;
  
  import com.ibm.icm.autoconfig.server.rmi.ServerHook;
  
  public class Client {
      private ServerHook serverHook;
  
      public static void main(String[] args) throws RemoteException, NotBoundException {
          Client client = new Client();
          client.connectTo("localhost");
          client.writeServer("Hello Server!");
      }
  
      private void connectTo(String serverHost) throws RemoteException, NotBoundException {
          Registry registry = LocateRegistry.getRegistry();
          serverHook = (ServerHook) registry.lookup("ServerHook");
      }
  
      private void writeServer(String msg) throws RemoteException {
          serverHook.write(msg);
      }
  }
  </code></pre>
  
  <p>Stacktrace for non local RMI:</p>
  
  <pre><code>Exception in thread "main" java.rmi.ConnectException: Connection refused to host: 9.65.186.135; nested exception is: 
      java.net.ConnectException: Connection refused: connect
      at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
      at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
      at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
      at sun.rmi.server.UnicastRef.newCall(Unknown Source)
      at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
      at com.ibm.icm.autoconfig.client.rmi.Client.connectTo(Client.java:21)
      at com.ibm.icm.autoconfig.client.rmi.Client.main(Client.java:15)
  Caused by: java.net.ConnectException: Connection refused: connect
      at java.net.PlainSocketImpl.socketConnect(Native Method)
      at java.net.PlainSocketImpl.doConnect(Unknown Source)
      at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
      at java.net.PlainSocketImpl.connect(Unknown Source)
      at java.net.SocksSocketImpl.connect(Unknown Source)
      at java.net.Socket.connect(Unknown Source)
      at java.net.Socket.connect(Unknown Source)
      at java.net.Socket.&lt;init&gt;(Unknown Source)
      at java.net.Socket.&lt;init&gt;(Unknown Source)
      at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
      at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
      ... 7 more
  </code></pre>