1. ホーム
  2. java

[解決済み] 使用中のリモートメソッド呼び出しポート

2022-02-13 09:19:59

質問事項

RMIでサーバ、クライアントのようなプログラムを作りました。しかし、コマンドプロンプトからrmiregistryを起動した後、私のサーバーを実行するたびに、ポートがすでに使用されているエラーがスローされます。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

解決方法は?

その rmiregistry は自分の処理でポート1099を使用しているので、自分の処理で使用することはできません。どちらかです。

  1. 同じプロセスでレジストリを起動する。 LocateRegistry.createRegistry() (望ましい)。
  2. 別のポートでオブジェクトをエクスポートします。
  3. を起動します。 rmiregistry を1099以外の別のポートに設定してください。