我有两个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线程中实例化。用于实例化的RMIClient类之前,RMIServer注册了远程对象,因此我得到了这个异常。
父子关系与此问题无关。碰巧这些类被创建的顺序是问题的根本原因。
答案 0 :(得分:0)
碰巧我需要客户端java程序来生成服务器 然后连接到它
为什么呢?在那种情况下,你甚至不需要RMI,更不用说第二个JVM了。只需在当前JVM中创建远程对象并直接调用其方法。
RMI本身完全没有意识到父/子关系,因此我不会进行这样的调查。异常字符串'Connection refused to host:0:0:0:0:0:0:0:1'非常可疑。你从哪里获得远程对象的存根?这就是连接目标的来源。