java.rmi.ConnectException:当rmi服务器是rmi客户端的子进程时,连接拒绝承载

java.rmi.ConnectException:当rmi服务器是rmi客户端的子进程时,连接拒绝承载,java,rmi,Java,Rmi,我有两个Java程序——RMIServer和RMIClient。如果我将它们作为两个单独的Java调用启动,那么一切都会按照预期工作。就是 $java-cp someclasspath server.mainserverclass& $java-cp someclasspath client.mainclientclass 但在我的项目中,我需要客户机java程序生成服务器,然后连接到服务器。我使用runtime.exec()方法和ProcessBuilder生成服务器实例,但当我这样做时,我得

我有两个Java程序——RMIServer和RMIClient。如果我将它们作为两个单独的Java调用启动,那么一切都会按照预期工作。就是

$java-cp someclasspath server.mainserverclass
&

$java-cp someclasspath client.mainclientclass

但在我的项目中,我需要客户机java程序生成服务器,然后连接到服务器。我使用
runtime.exec()
方法和ProcessBuilder生成服务器实例,但当我这样做时,我得到以下结果:

.Exception in thread "main" java.rmi.ConnectException:  
    Connection refused to host: 0:0:0:0:0:0:0:1; nested exception is:
但有趣的是,如果手动杀死RMIClient实例,RMIServer会变成孤立的(父对象是
pid:1
),然后如果我运行RMIClient,我就可以连接到孤立的RMI服务器了

因此,在中,似乎当RMIServer和RMIClient具有父子关系时,我无法通过RMI进行连接

非常感谢您的帮助/指点

*****回答*******(显然我没有足够的声誉来回答我自己的问题:-)

这是我的错误。RMIServer和RMIClient类在两个单独的Java线程中实例化。在RMIServer注册远程对象之前,已实例化的RMIClient类,因此我得到此异常

亲子关系与此问题无关。碰巧这些类的创建顺序是问题的根本原因

碰巧我需要客户端java程序来生成服务器 然后连接到它

为什么??在这种情况下,您甚至不需要RMI,更不用说第二个JVM了。只需在当前JVM中创建远程对象并直接调用其方法


RMI本身完全不知道父母/孩子之间的关系,所以我不会进行这种调查。异常字符串“连接拒绝承载:0:0:0:0:0:0:0:1”非常可疑。你从哪里得到远程对象的存根的?这就是连接目标的来源。

您的服务器是否正在输出到stdout或stderr?如果是,它正在填充缓冲区,因为您没有从
进程
对象读取它,它将导致它阻塞/锁定。我确实想过。我正在读取子进程的stdout和stderr并重定向它。我可以确认它打印的信息。因此,我怀疑缓冲区是否已满。根据设计,服务器和客户机应该在不同的机器上运行,但我正在编写一个集成测试框架,它要求客户机和服务器从同一个进程生成(只是为了让用户更容易运行集成测试)。“异常字符串“连接拒绝承载:0:0:0:0:0:0:0:0:1”非常可疑。你从哪里得到远程对象的存根的?这就是连接目标的来源from@user1013840引用我自己的话到底有什么意义?下面是我如何查找远程存根的:Registry Registry=LocateRegistry.getRegistry();archive=(archive)registry.lookup(archive.SERVICE_NAME);“引用我自己的话来反驳我到底有什么意义?”-很抱歉,我试图复制粘贴你的评论并添加我的回复,但在此之前我点击了return并将其保存为评论:-)