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

Java 正在使用远程方法调用端口,java,exception,rmi,Java,Exception,Rmi,我用RMI创建了一个服务器、客户机之类的程序。但每当我在命令提示符下启动rmiregistry后运行服务器时,就会抛出端口已在使用错误。只有我启动了注册。我已经在netstat上查过了 服务器代码: public class Server implements Runnable, Linker{ private static Server server = null; private static Linker l = null; private String name =

我用RMI创建了一个服务器、客户机之类的程序。但每当我在命令提示符下启动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

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

rmiregistry正在其进程中使用端口1099,因此您不能在自己的进程中使用它。要么:

  • 通过
    LocateRegistry.createRegistry()
    (首选)在相同的过程中启动注册表
  • 将对象导出到其他端口
  • 在1099以外的其他端口上启动
    RMI注册表

  • 使用此服务器代码-

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

    如果您正在使用macOS,您可以按如下方式停止端口:

    首先需要找到PID_编号:
    lsof-i:1099


    然后杀死该端口:
    kill-9pid\u number

    使用ps-aef | grep注册表。 查找RMI注册表使用的pid。 杀死pid 再次运行服务器

    试试这个:

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

    这就是我的问题所在。我想出来了,当我准备在这里发帖时,我找到了你的回复。netstat-aon显示它正在侦听的位置。在这种情况下,它监听所有接口。为什么少于55000?对于大多数人来说,端口也必须大于1024。最好先尝试创建,如果失败,则执行getRegistry)。您的方式有时间窗问题。是否可以无例外地进行@莱斯科特,正如我在你引用的问题中所说的,第fwiw-9号基本上是一个“强制退出”的编号。这只会杀死需要的RMI注册中心。你必须找到潜在的问题,而不是把一切都拍到眼前。