2010-06-18 66 views
14

我可以知道Java RMI连接使用哪个端口?Java RMI连接使用什么端口?

如果我想使用RMI连接将Java客户端应用程序连接到Java服务器应用程序,我需要在服务器计算机上打开哪个端口以便客户端应用程序可以连接到它?

我想在服务器机器上设置防火墙,但我不知道应该打开哪个端口。

回答

19

RMI通常不会在防火墙上运行,因为它使用不可预知的端口(它从1099开始,然后以随机端口运行之后)。

在这些情况下,您通常需要通过HTTP隧道传输RMI,这很好地描述了here

+0

非常感谢!你上面读过El Guapo的答案吗?你认为这是一个可行的替代解决方案?我可以使用rmiregistry命令将服务器端口设置为固定端口吗? – kwc 2010-06-18 16:50:31

+0

@kwc:您可以将RMI注册表设置为固定端口,但是我不相信您可以控制单个客户端 - 服务器连接。 – skaffman 2010-06-18 21:10:37

+8

时间已经超过了这一点有点,如果你在Java 7更新4有希望与国旗'''-Dcom.sun.management.jmxremote.rmi.port = 7091'' 看到这篇博文: http: //hirt.se/blog/?p=289 – davey 2013-10-09 21:50:19

7

在RMI,关于端口有涉及两种不同的机制:

1)默认情况下,RMI注册表使用端口1099

2)客户端和服务器(存根,远程对象)上通信随机端口,除非在导出远程对象时指定了固定端口。通信是通过一个使用0作为起始端口的套接字工厂启动的,意思是“使用任何可用的端口”,介于0和65535之间。

+0

但是我从某处听说某些Java应用程序连接被设置为使用随机端口。你有什么想法是什么样的Java连接?它与Java RMI有关吗?谢谢。 – kwc 2010-06-18 16:27:56

+2

是的,不,请参阅http://stackoverflow.com/questions/1706685/java-rmi-client-side-random-ports了解更多细节。 – 2010-06-18 16:41:16

+0

默认情况下,* RMI Registry *使用端口1099.默认情况下,RMI远程对象使用随机系统分配的端口,除非在导出远程对象时指定了固定端口。 – EJP 2015-08-24 12:07:55

3

您通常使用rmiregistry命令在服务器上设置端口。您可以在命令行上设置端口,否则它将默认为1099

+0

你能告诉我如何使用rmiregistry命令吗? – kwc 2010-06-18 16:25:23

+0

它可能是最好的链接发送给您的太阳页面: http://java.sun.com/docs/books/tutorial/rmi/running.html 如果它是一个Linux的盒子,只要确保你在您的路径中有$ JAVA_HOME/bin,您将能够运行命令 – 2010-06-18 16:32:31

2

如果你可以修改客户端,然后让它打印出远程引用,你会看到它使用的是什么端口。例如。

ServerApi server = (ServerApi) registry.lookup(ServerApi.RMI_NAME); 
System.out.println("Got server handle " + server); 

会产生类似:

了服务器处理代理[ServerApi,RemoteObjectInvocationHandler [UnicastRef [liveRef:端点:172.17.3.190:9001,OBJID: - 7c63fea8:...

您可以在其中看到端口为9001.如果远程类没有指定端口,则它将在重新启动后更改。如果你想使用一个固定的端口,那么你需要确保远程类构造函数是这样的:

super(rmiPort) 
-1

端口可以在这里找到:java.rmi.registry.Registry.REGISTRY_PORT(1099)

0

取决于你如何实现RMI,你可以设置注册表端口(注册表是一个“独特的服务点”)。如果您未设置显式端口,则默认情况下,注册表将默认采用端口1099。在某些情况下,你有一个防火墙,并且防火墙不允许你的rmi-client看到注册表背后的存根和对象,因为这些东西是随机地运行的,端口是注册表使用的另一个端口,而且这个端口被防火墙阻止 - 当然。 如果您使用RmiServiceExporter来配置您的RmiServer,您可以使用方法rmiServiceExporter.setServicePort(port)来修复rmi端口,并在防火墙中打开此端口。

编辑:我解决这个问题,这个职位:http://www.mscharhag.com/java/java-rmi-things-to-remember

+0

您引用的博客完全忽略了对UnicastRemoteObject.UnicastRemoteObject()构造函数的'port'参数的存在和'UnicastRemoteObject.exportObject()'。 'RmiServiceExporter'是Spring的一部分,而不是Java RMI。 – EJP 2017-02-13 03:32:27

+0

@EJP,我回答了关于这篇文章的中心问题,并补充了我的答案,解释了用Spring更改服务端口的解决方案。你可以看到,我的短语从“如果你使用RmiServiceExporter ...”开始。感谢您的有益回应。 – 2017-02-15 03:54:37

+0

你回答了几个问题中的一个,并且介绍了Spring,但没有在问题中提及它。 – EJP 2017-02-25 14:59:51

6

所有的答案至今是不正确的。注册表通常使用端口1099,但您可以更改它。但这不是故事的结尾。远程对象也使用端口,但不一定是1099.

如果在导出时未指定端口,则RMI使用随机端口。因此解决方案是在导出时指定端口号。如果有的话,这是一个需要在防火墙中打开的端口。

  • 在您的远程对象扩展UnicastRemoteObject的情况下,有其构造函数调用super(port)一些非零的端口号。

  • 在不延伸UnicastRemoteObject的情况下,请给UnicastRemoteObject.exportObject()提供一个非零端口号。

有几个皱纹。

  • 如果你不使用的套接字工厂,并在导出你的第一个远程对象的时候提供一个非零的端口号,RMI将自动共享随后导出的远程对象港口,除非指定端口号,或指定零。这第一个远程对象包括与LocateRegistry.createRegistry().因此,如果你创建在端口1099一Registry创建的注册表,从JVM可如果你使用套接字工厂共享1099端口

  • 出口的所有其他对象和你RMIServerSocketFactory有合理实施equals(),同样适用于上述情况。

  • 在这两种情况下,您都可以为所有远程对象使用相同的非零显式端口号,例如, createRegistry(1099)后跟任意数量的super(1099)exportObject(..., 1099)调用。

+0

@sv。聊天系统不用于提出新问题。 – EJP 2017-02-26 02:32:07

+0

问题是现场[这里](http://stackoverflow.com/q/42477912)。谢谢。 – 2017-02-27 04:36:43

0

参照上述其他的答案,这是我的观点 -

有参与的客户端和服务器端的端口。

  • 对于服务器端/远程端,如果您在不提供端口的情况下导出对象,远程对象将使用随机端口来侦听。

  • 客户端在查找远程对象时,始终使用其一侧的随机端口并将连接到上面列出的远程对象端口。