停止RMI服务器后无法启动

14
我在停止RMI注册表后重新启动它时遇到了问题:
import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.UnicastRemoteObject;
import javax.swing.JOptionPane;

public class CinemaServer
{
    private Registry registry;
    ClientImpl clientImple; //remote interface implemented class
    private static String title="Cinema Pvt Ltd";

    public CinemaServer() {
        try {
            clientImple = new ClientImpl();
            registry=LocateRegistry.createRegistry(3311);
            registry.rebind("RMI_INSTANCE", clientImple);
    } catch (RemoteException e) {
            JOptionPane.showMessageDialog(null, "Can't Start RMI Server",title,JOptionPane.ERROR_MESSAGE);
        }
    }

    public void stopServer()
    {
        try {
            registry.unbind("RMI_INSTANCE");
            UnicastRemoteObject.unexportObject(clientImple, true);
        } catch (NotBoundException e) {
            JOptionPane.showMessageDialog(null, "Can't Stop Server",title,JOptionPane.ERROR_MESSAGE);
        }
    }
}
  1. 我使用以下命令启动服务器:CinemaServer ser=new CinemaServer();

  2. 当我调用 ser.stopServer(); 时,它会停止。

  3. 但是我无法重新启动它

我得到的错误信息为:

java.rmi.server.ExportException: internal error: ObjID already in use
at sun.rmi.transport.ObjectTable.putTarget(Unknown Source)
at sun.rmi.transport.Transport.exportObject(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.exportObject(Unknown Source)
at sun.rmi.transport.tcp.TCPEndpoint.exportObject(Unknown Source)
at sun.rmi.transport.LiveRef.exportObject(Unknown Source)
...

1
你能复制粘贴一下错误信息吗?当你尝试重新启动时会发生什么? - user7094
你能贴出堆栈跟踪吗? - Michael
@mikaveli,抱歉,什么是“堆栈跟踪”? - sAaNu
基本上,它是你遇到的异常的完整错误输出。 - Michael
1
请将所有的 JOptionPane.show... 调用替换为 e.printStackTrace(),并复制您在控制台上得到的内容。 - Paŭlo Ebermann
显示剩余2条评论
1个回答

18

调用 createRegistry() 失败,不是因为重新导出对象。请勿重复创建注册表。


哦,我怎么会忘了呢?谢谢@jtahlborn,我在你的帮助下解决了问题,再次感谢。 - sAaNu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接