2011-12-01 54 views
14

我已经创建了一个带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 

回答

5

rmiregistry在其过程中使用端口1099,因此您不能在您的过程中使用它。或者:

  1. 通过LocateRegistry.createRegistry()(首选)在同一进程中启动注册表。
  2. 将对象导出到不同的端口。
  3. 比1099
+0

那是在我的情况的问题。我想清楚了,当我准备在这里发帖时,我发现了你的回复。 netstat -aon显示它正在侦听的位置。在这种情况下,它监听所有接口。 – Andrews

1

重新检查该端口1099没有被任何其他过程或用户或在其他港口开始调整。

6

使用其他不同的端口上启动rmiregistry此服务器的代码 - 如果你使用的MacOS

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

为什么低于55000?大多数人的端口也必须> 1024。首先尝试创建会更好,然后如果失败,请执行getRegistry))。你的方式有时间窗口问题。 – EJP

+0

是否有可能无例外地做出来? http://stackoverflow.com/q/14982760/897090 – Jofsey

+0

@莱斯科特正如我在你引述的问题中所说的,没有。 – EJP

39

,你可以阻止端口以下为:

首先你需要找到PID号码:lsof -i :1099

然后杀掉那个端口:kill -9 PID_number

+0

fwiw -9基本上是一个'强制退出' – Shanimal

1

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

0

试试这个:

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