java - 如何将位于 NAT 后面的 ActiveMQ 客户端连接到不在 NAT 后面的服务器?

标签 java activemq rmi jmx

我在网上查了一下,我发现的所有内容都显示了如何创建一个单独的服务器来连接到位于 nat 或防火墙后面的主服务器。

但在我的例子中,客户端位于 NAT 后面,服务器位于本地网络上。

所以它的设置有点像下面:

Client Actual:10.0.0.1 -> Client NAT:100.0.0.2:1111 <--> Server 10.0.0.0:1099

我用来连接服务器的Java代码如下:

String serviceUrl = "service:jmx:rmi:///jndi/rmi://10.0.0.0:1099/jmxrmi"; 
String[] credentials = new String[] {"username", "password"}; 
String objectName = "org.apache.activemq:type=Broker,brokerName=test";
JMXServiceURL url = new JMXServiceURL(serviceUrl);

Map<String, String[]> env = new HashMap<String, String[]>();
env.put(JMXConnector.CREDENTIALS, credentials);

JMXConnector jmxc = JMXConnectorFactory.connect(url, env);
conn = jmxc.getMBeanServerConnection();

broker = MBeanServerInvocationHandler.newProxyInstance(conn, new ObjectName(objectName), BrokerViewMBean.class, true);

它抛出的错误是:

java.rmi.ConnectException: Connection refused to host: 10.0.0.0; nested exception is: 
java.net.ConnectException: Connection timed out: connect

所以我的问题是,如何使 NAT 连接后面的客户端正常工作?

最佳答案

首先:ActiveMQ 工作的网络配置没有什么特别的。 ActiveMQ 的协议(protocol)是单端口,并且可以像大多数其他 TCP/IP 协议(protocol)一样轻松路由。

因此,假设服务器正在正确监听其 TCP 端口,并且客户端可以在本地成功连接到它,则可以像分析任何其他与网络相关的问题一样分析此问题。

客户端能否 ping 通服务器?从您提供的 IP 地址方案中很难正确理解您的网络,但正如现在提供的那样,客户端计算机将简单地假设服务器位于本地网络上,因此发送 ARP 请求,询问 MAC 地址“10.0.0.0”(这将超时,因为没有这样的机器来应答请求),而不是将请求转发到其 NAT 网关。如果这确实是您遇到的问题,那么存在三种可能的解决方案:a) 修改网络布局(让客户端使用不同的 IP 方案),b) 在客户端计算机上为服务器的 IP 设置静态路由,以强制其通过网关进行路由,或 c) 在网关上添加端口重定向并让客户端连接到网关的 IP 地址。现在,解决方案 a 不太实用,除非您的设置只是实验室配置。解决方案b是一种可能性,但非常糟糕。解决方案C,即在网关上设置端口重定向,是此类问题最常见的解决方案。

关于java - 如何将位于 NAT 后面的 ActiveMQ 客户端连接到不在 NAT 后面的服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37208170/

相关文章:

java - 如何使用curl命令在activemq主题中发布消息?

java - IPC 的 RMI 替代品?

java - org.graphstream.algorithm.APSP$APSPInfo.getShortestPathTo 处的 NullPointerException - 图形问题

java - JDBC 连接的真正含义是什么?想了解相同的内部结构

java - 如何让 JMS 消息监听器无限期地监听

java - J2EE 到 Java 独立应用程序的通信

java - 为什么在从 applet 使用 RMI 时会出现 AccessControlException?

java - Java代码检查事件时间戳记是否在工作日和工作时间从9:30 AM到4:00 PM

java - 如何使用Where子句从多个表中删除多行?

java - 使用 Websocket 连接 stomp 和 ActiveMQ