Java 在RMI中导出远程数据和套接字重用

Java 在RMI中导出远程数据和套接字重用,java,rmi,Java,Rmi,我是RMI的新手,所以如果我的问题很愚蠢,请原谅我。 我正在尝试以并发方式导出数据。如何重用同一端口一次导出多个远程对象。 有谁能用一个例子来指导我做到这一点 我尝试这样做,第一个对象被导出,但在第二次导出时出现以下异常 java.rmi.server.ExportException:端口已在使用中:55580;嵌套异常是: java.net.BindException:地址已在使用中:JVM\u Bind 我使用了下面的代码片段 UnicastRemoteObject.exportObject

我是RMI的新手,所以如果我的问题很愚蠢,请原谅我。 我正在尝试以并发方式导出数据。如何重用同一端口一次导出多个远程对象。 有谁能用一个例子来指导我做到这一点

我尝试这样做,第一个对象被导出,但在第二次导出时出现以下异常

java.rmi.server.ExportException:端口已在使用中:55580;嵌套异常是:
java.net.BindException:地址已在使用中:JVM\u Bind

我使用了下面的代码片段

UnicastRemoteObject.exportObject(remoteObj,55580)

如果跳过端口号,RMI将拾取任何端口号。如下

UnicastRemoteObject.exportObject(remoteObj)

在我的情况下,端口号对于我的应用程序是固定的

如何重用同一端口一次导出多个远程对象

默认情况下会发生这种情况。从同一JVM导出的所有远程对象

  • 不要指定端口号,或指定端口零,以及
  • 不要指定服务器或客户端套接字工厂,也不要指定由
    equals()确定的相同套接字工厂。
将在同一端口上导出


我的结论是,您必须从两个JVM导出远程对象。没有必要这么做。把它们放在一起。如果您也从那里启动注册表,使用
LocateRegistry.createRegistry()
,您可以使用注册表端口1099进行所有操作,并且它已经在IANA保留,因此没有关于该号码的争论。

感谢您的指导。是的,你的结论是对的。我的JVM与注册JVM不同。正如我理解您的回答,如果我导出注册表所在JVM中的对象,那么在导出过程中,如果我不提及端口号,那么所有对象都会在1099上导出。我说得对吗?第二,如果我需要从不同的JVM执行相同的操作,那么我可以将端口55580设置为RMI的默认端口。因此,当我使用以下
UnicastRemoteObject.exportObject(remoteObj)
时,它将自动接受它。在我的情况下,我不能使用注册表JVM.1。对2.不需要。每个JVM需要一个不同的端口。接下来的问题是,为什么您认为需要单独的JVM。我必须使用已经存在的注册表。JVM对于其他服务也是通用的。所以我不能使用那个JVM。如果您能向我解释您的观点,我将不胜感激。您将需要每个JVM都有一个不同的端口。如果我跳过了
exportObject
方法中的端口,那么RMI将选择任何端口。这个港口对所有其他出口都将保持不变吗?在这种情况下,我们如何处理防火墙问题?这里的防火墙问题意味着我必须为防火墙打开端口。如果我听起来很傻,请原谅。每个JVM都需要一个不同的端口。你不能分享它们。我说得再简单不过了。您现在提出的防火墙问题是一个全新的问题,但解决方案是要么打开所有必需的端口,要么取消对JVM的限制。它没有架构上的原因。在我看来,您的需求似乎过于详细,而且在编写时没有充分了解RMI的实际工作原理。[您现在删除的评论]那么问题到底是什么?当您可以通过使用一个JVM和一个端口来节约这两个资源时,指定多个JVM和多个端口似乎很奇怪。