Java RMI 和 netstat 输出

Posted

技术标签:

【中文标题】Java RMI 和 netstat 输出【英文标题】:Java RMI and netstat output 【发布时间】:2017-02-27 04:36:18 【问题描述】:

我正在尝试让我的 RMI 服务跨防火墙工作。我按照this answer 中的说明在端口 1099 上运行 RMI 注册表和我的 RMI 服务,但是,当我执行 netstat 时,我看到在 RMI 客户端和服务器上打开了不同的端口号。

[user@machine] ~ $ netstat -ant | grep 1099
tcp6       0      0 :::1099                 :::*                    LISTEN     
tcp6       0      0 10.1.1.1:1099         10.1.1.2:33400        ESTABLISHED
tcp6       0      0 10.1.1.1:1099         10.1.1.1:33378        ESTABLISHED
tcp6       0      0 10.1.1.1:33408        10.1.1.1:1099         ESTABLISHED
tcp6       0      0 10.1.1.1:1099         10.1.1.1:33408        ESTABLISHED
tcp6       0      0 10.1.1.1:46866        10.1.1.2:1099         ESTABLISHED
tcp6       0      0 10.1.1.1:1099         10.1.1.2:33404        ESTABLISHED
tcp6       0      0 10.1.1.1:33378        10.1.1.1:1099         ESTABLISHED
tcp6       0      0 10.1.1.1:46862        10.1.1.2:1099         ESTABLISHED
tcp6       0      0 10.1.1.1:46864        10.1.1.2:1099         ESTABLISHED
tcp6       0      0 10.1.1.1:1099         10.1.1.2:33402        ESTABLISHED
tcp6       0      0 10.1.1.1:46860        10.1.1.2:1099         ESTABLISHED

10.1.1.1 和 10.1.1.2 都是 RMI 服务器和客户端相互通信。

这是我的代码 sn-p:

IRemoteService 存根 = (IRemoteService) UnicastRemoteObject.exportObject(service, 1099);

registry = LocateRegistry.createRegistry(1099);

registry.rebind(IRemoteService.serviceName, stub);

这是预期的吗?为什么我看到端口号如 33400、33378 等?还是我对源端口和目标端口如何工作的理解有误?我希望看到所有连接(注册表查找和远程服务调用)都只到端口 1099。

注意:我还没有在防火墙环境中运行上述程序,只是在我的实验室本地尝试,然后再尝试在防火墙环境中。

【问题讨论】:

【参考方案1】:
tcp6       0      0 10.1.1.1:1099         10.1.1.2:33400        ESTABLISHED

端口 33400 上的客户端和端口 1099 上的服务器之间的连接。您无法仅从这一行中看出这一点,但您提到了使用 1099 的 RMI,并且之前的一行中应该有 1099 LISTENING。

tcp6       0      0 10.1.1.1:1099         10.1.1.1:33378        ESTABLISHED

33378 端口上的客户端和 1099 端口上的服务器之间的连接。备注同上。

tcp6       0      0 10.1.1.1:33408        10.1.1.1:1099         ESTABLISHED

33408 端口上的客户端和 1099 端口上的服务器之间的连接。备注同上。如果客户端位于不同的主机上,则此行将仅显示在客户端主机上。

tcp6       0      0 10.1.1.1:1099         10.1.1.1:33408        ESTABLISHED

连接的另一端。此行仅在服务器主机上显示。

tcp6       0      0 10.1.1.1:46866        10.1.1.2:1099         ESTABLISHED
tcp6       0      0 10.1.1.1:1099         10.1.1.2:33404        ESTABLISHED
tcp6       0      0 10.1.1.1:33378        10.1.1.1:1099         ESTABLISHED
tcp6       0      0 10.1.1.1:46862        10.1.1.2:1099         ESTABLISHED
tcp6       0      0 10.1.1.1:46864        10.1.1.2:1099         ESTABLISHED
tcp6       0      0 10.1.1.1:1099         10.1.1.2:33402        ESTABLISHED
tcp6       0      0 10.1.1.1:46860        10.1.1.2:1099         ESTABLISHED

等等。

这是预期的吗?

是的。

为什么我看到端口号是 33400、33378 等?

因为连接有两端:服务器端和客户端,而客户端端口通常是相当随机选择的。

或者我对源端口和目标端口如何工作的理解有误?我希望看到所有连接(注册表查找和远程服务调用)都只到端口 1099。

他们是。但是这些连接有客户端。

这确实是关于 TCP 和 netstat 的问题,而不是 RMI 或 Java。

【讨论】:

我想我真正的问题是除了 1099 之外还需要在防火墙上打开像 33404 (10.1.1.1:1099 -> 10.1.1.2:33404) 这样的端口? 那么您是说防火墙上只需要打开服务器端口(1099),而不需要打开客户端端口(33408、33404 等)? 我没有说过任何关于防火墙的事情,而且我对“你这么说”的问题完全过敏,因为答案总是“不”,就像这里一样,但正如你所说现在问它,作为一个问题,服务器端防火墙必须允许 1099 上的入站连接(根据您之前的问题,10991);客户端防火墙必须允许到这些端口的出站连接;并且任何防火墙都不应该对源端口做出任何裁决。这样做没有任何收获。 “防火墙都不应该对源端口做出任何裁决” - 好的,感谢您的澄清。立即清除。

以上是关于Java RMI 和 netstat 输出的主要内容,如果未能解决你的问题,请参考以下文章

Java RMI

Java RMI 和 RPC 有啥区别?

Intellij 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099,端口被占用

IDEA - 启动tomcat 1099端口被占用

Intellij 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099,端口被占用

Java RMI(远程方法调用)示例程序