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:
- Start the registry in the same process, via
LocateRegistry.createRegistry()
(preferred). - Export your object on a different port.
- 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);
}
Author by
Andrews
Updated on July 09, 2022Comments
-
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 over 12 yearsThat 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 over 12 yearsWhy 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 about 11 yearsIs it possible to make without exceptions? stackoverflow.com/q/14982760/897090
-
user207421 almost 11 years@Lescott As I said in the question you quoted, no.
-
Shanimal over 8 yearsfwiw -9 is basically a 'force quit'
-
user207421 over 4 yearsNo. This will just kill the RMI Registry, which is needed. You have to find the underlying problem, not just shoot everything in sight.