Java中的ZeroMQ端口转发

时间:2015-10-21 15:20:24

标签: java zeromq portforwarding jeromq

我有一个用Java编写的程序,它应该通过 ZeroMQ 发送消息,然后由我运行的另一个程序进行监听和响应。

问题是侦听器位于本地网络上的另一台计算机上,我需要以某种方式在ZeroMQ中执行端口转发,以便通过网络接收消息。

    ZMQ.Context context = ZMQ.context(1);
    ZMQ.Socket requester = context.socket(ZMQ.REQ);
    requester.connect("tcp://192.168.78.14:5570"); //192.168.78.14 is the address of listening machine

    String msg = "Message";
    requester.send(msg.getBytes());

    byte[] reply = requester.recv();

当运行上面的代码时,程序会无限期地等待响应(从未到来),因此实际上没有响应。监听器正在tcp://127.0.0.1:5570上收听消息。将其设置为tcp://0.0.0.0:5570tcp://*:5570,可能会打开侦听给定端口上的所有地址也不会产生任何结果。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

这个解决方案已经在生产中使用了大约二十年,因为大型的空间分布式虚拟机需要实现类似的host:port会话,而不管它们在各自实际中的实际实例化网络地址空间

在主机之间使用ssh-port-forwarding隧道

解决方案原则上独立于ZeroMQ框架设置。

在您希望的两台主机之间设置实时SSH连接。

在每一端,根据 port# 通信设置中使用的ZeroMQ来提供相应的端口转发映射。< / p>

host A 192.168.78.14转发本地端口5570发送到远程IP:port#目标

L5570 forward to 192.168.78.15:5570

host A ZeroMQ - 通信模式透明地“说话”到本地端口5570,这是由服务提供的将ssh - 隧道转发到对方,托管 B 并将其传送到引用端口5570以进行进一步的套接字流量处理。

host B 192.168.78.15 ZeroMQ - 通信模式通过端口 {{1}无缝“交互”好像通信对方正在“坐”在同一个“盒子”中,并处理实际通过5570 - 隧道传送的套接字流量,而不知道这样的技巧。

QED。

对于一个更快更容易的原型设计,可以选择使用相当ssh原型,它不会引入任何高级.socket(ZMQ.PAIR) - 行为模式,只需发送任何套接字接口即可指示发送到对方(无需等待ZeroMQ - 回复之前的REP - 消息)