正在使用的远程方法调用端口

时间:2011-12-01 06:07:06

标签: java exception rmi

我用RMI创建了一个Server,Client类程序。但是每当我从命令提示符启动rmiregistry后运行我的服务器时,就会抛出已经处于使用状态的端口错误。只有我开始了这种情况。我已经从netstat检查了它。

服务器代码:

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);

    }
}

客户代码:

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();
    }
}

例外:

java.rmi.server.ExportException: Port already in use: 1099; nested exception is: 
java.net.BindException: Address already in use: JVM_Bind

6 个答案:

答案 0 :(得分:42)

如果您使用的是macOS,则可以按以下方式停止端口:

首先需要找到PID_number:lsof -i :1099

然后杀死该端口:kill -9 PID_number

答案 1 :(得分:7)

rmiregistry在其进程中使用端口1099,因此您无法在其中使用它。之一:

  1. 通过LocateRegistry.createRegistry()(首选)
  2. 在同一过程中启动注册表
  3. 将您的对象导出到其他端口。
  4. 在1099以外的其他端口上启动rmiregistry

答案 2 :(得分:7)

使用此服务器代码 -

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);
}

答案 3 :(得分:1)

重新检查端口1099是否未被任何其他进程或用户使用,或者是否在其他某个端口上启动rmiregistry。

答案 4 :(得分:1)

使用ps -aef | grep rmiregistry。 找到rmiregistry使用的pid。 杀了pid Den再次运行服务器...... !!!!

答案 5 :(得分:1)

试试这个:

lsof -P | grep ':1099' | awk '{print $2}' | xargs kill -9