J'ai créé un type de programme Serveur, Client avec RMI. Mais chaque fois que j'exécute mon serveur après avoir démarré le rmiregistry à partir de l'invite de commande, l'erreur de port déjà utilisé est levée. C'est seulement moi qui ai commencé le rémiregistry. Je l'ai vérifié sur netstat.
Code serveur:
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);
}
}
Code client:
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
rmiregistry
utilise le port 1099 dans son processus, vous ne pouvez donc pas l'utiliser dans le vôtre. Soit:
LocateRegistry.createRegistry()
(préféré).rmiregistry
sur un autre port que 1099.Si vous utilisez macOS, vous pouvez arrêter le port suivant:
Première chose dont vous avez besoin pour trouver le numéro PID: lsof -i :1099
Et puis tuez ce port: kill -9 PID_number
Utilisez ce code serveur -
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);
}
Utilisez ps -aef | grep rmiregistry. trouver le pid que rmiregistry utilise. Tuez le pid Den, exécutez à nouveau le serveur ... !!!!
Essaye ça:
lsof -P | grep ':1099' | awk '{print $2}' | xargs kill -9
Vérifiez à nouveau si le port 1099 n'est utilisé par aucun autre processus ou utilisateur ou démarrez le rmiregistry sur un autre port.