【发布时间】:2011-10-26 02:27:40
【问题描述】:
我有两个 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 进行连接。
非常感谢任何帮助/指针。
*****ANSWER*****(显然我没有足够的声誉来回答我自己的问题:-)
这是我的错误。 RMIServer 和 RMIClient 类在两个独立的 Java 线程中实例化。用于实例化的 RMIClient 类在 RMIServer 注册了远程对象,因此我得到了这个异常。
父子关系与此问题无关。碰巧这些类的创建顺序是问题的根本原因。
【问题讨论】:
-
您的服务器是否有可能输出到 stdout 或 stderr?如果是,它正在填充缓冲区,因为您没有从
Process对象中读取它,它会导致它阻塞/锁定。 download.oracle.com/javase/6/docs/api/java/lang/Process.html -
我确实考虑过。我正在读取子进程的 stdout 和 stderr 并重定向它。我可以确认查看它打印的消息。所以,我怀疑缓冲区是否已满。