【问题标题】:java.rmi.ConnectException: Connection refused to host when RMI server is child process of RMI clientjava.rmi.ConnectException:当 RMI 服务器是 RMI 客户端的子进程时,连接被拒绝托管
【发布时间】: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 并重定向它。我可以确认查看它打印的消息。所以,我怀疑缓冲区是否已满。

标签: java rmi


【解决方案1】:

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

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

RMI 本身完全不知道父/子关系,所以我不会继续调查。异常字符串 'Connection denied to host: 0:0:0:0:0:0:0:1' 非常可疑。你从哪里得到远程对象的存根?这就是连接目标的来源。

【讨论】:

  • 按照设计,服务器和客户端应该运行在不同的机器上,但是我正在编写一个集成测试框架,它要求客户端和服务器从同一个进程中产生。(只是为了用户更容易运行集成测试)。
  • " 异常字符串 'Connection denied to host: 0:0:0:0:0:0:0:1' 非常可疑。你从哪里得到远程对象的存根?那是连接目标来自哪里
  • @user1013840 引用我自己的话到底有什么意义?
  • 这是我查找远程存根的方式:Registry registry = LocateRegistry.getRegistry(); archive = (Archive)registry.lookup(Archive.SERVICE_NAME);
  • “引用我自己的话到底有什么意义?” - 抱歉,我试图复制粘贴您的评论并添加我的回复,但在此之前我点击返回并保存它作为评论:-)
猜你喜欢
  • 1970-01-01
  • 2014-04-20
  • 2012-02-20
  • 1970-01-01
  • 2016-06-21
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
相关资源
最近更新 更多