我有一个用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:5570
或tcp://*:5570
,可能会打开侦听给定端口上的所有地址也不会产生任何结果。
感谢任何帮助。
答案 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
- 消息)