Remote method invocation port in use

59,825

Solution 1

The rmiregistry is using port 1099 in its process so you can't use it in yours. Either:

  1. Start the registry in the same process, via LocateRegistry.createRegistry() (preferred).
  2. Export your object on a different port.
  3. Start the rmiregistry on a different port other than 1099.

Solution 2

If you're using macOS, you can stop port following as:

First thing you need to find the PID_number: lsof -i :1099

And then kill that port: kill -9 PID_number

Solution 3

Use this Server code -

Registry registry = null;
try {
    registry = LocateRegistry.getRegistry(52365);//use any no. less than 55000
    registry.list();
    // This call will throw an exception if the registry does not already exist
}
catch (RemoteException e) { 
    registry = LocateRegistry.createRegistry(52365);
}
Share:
59,825
Andrews
Author by

Andrews

Updated on July 09, 2022

Comments

  • Andrews
    Andrews almost 2 years

    I have created a Server, Client kind of program with RMI. But whenever I run my Server after starting the rmiregistry from command prompt, the port already in use error is thrown. Its only me who started the rmiregistry. I have checked it from netstat.

    Server Code:

    public class Server implements Runnable, Linker{
    
    
    private static Server server = null;
        private static Linker l = null;
        private String name = null;
        public Server(){}
    
        public void setName(String name){
            this.name = name;
        }
        public String getName(){
            return name;               
        }  
        public void run(){
            while(!("Andy").equalsIgnoreCase(name)){
    
            }
        }
        public static void createStub(){
            try{
                server = new Server();
                l = (Linker) UnicastRemoteObject.exportObject(server, 1099);
    
                Registry registry = LocateRegistry.getRegistry();
                registry.bind("Link", l);
                System.out.println("Ready");
            }
            catch(Exception e){
                e.printStackTrace();
            }
        }                       
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            createStub();
            Thread t = new Thread(server);
    
        }
    }
    

    Client Code:

    public class Client implements Runnable{
    
    
    private Scanner sc = new Scanner(System.in);
        private Linker linker = null;
    
        public void loadStub(){
            try{
                Registry registry = LocateRegistry.getRegistry(1099);
                linker = (Linker) registry.lookup("Link");
    
            }catch(Exception e){
    
            }
        }
        public void run(){
            String ip = null;
            while(sc.hasNext()&&!(ip = sc.nextLine()).equalsIgnoreCase(":q")){
                try {
                    linker.setName(ip);
                } catch (RemoteException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    
    
        public static void main(String...args){
            Client client = new Client();
            client.loadStub();
            Thread t = new Thread(client);
            t.start();
        }
    }
    

    Exception:

    java.rmi.server.ExportException: Port already in use: 1099; nested exception is: 
    java.net.BindException: Address already in use: JVM_Bind
    
  • Andrews
    Andrews over 12 years
    That was the problem in my case. I figured it out and when I was about to post here, I found your reply. netstat -aon shows where it is listening. In this case its listening on all interfaces.
  • user207421
    user207421 over 12 years
    Why less than 55000? The port also has to be > 1024 for most people. It would be much better to attempt the creation first, then if that fails do getRegistry)). Your way has a timing window problem.
  • Nelson Tatius
    Nelson Tatius about 11 years
    Is it possible to make without exceptions? stackoverflow.com/q/14982760/897090
  • user207421
    user207421 almost 11 years
    @Lescott As I said in the question you quoted, no.
  • Shanimal
    Shanimal over 8 years
    fwiw -9 is basically a 'force quit'
  • user207421
    user207421 over 4 years
    No. This will just kill the RMI Registry, which is needed. You have to find the underlying problem, not just shoot everything in sight.